开发者

Draw a square in opengl at mouse position

I am trying to draw a simple square wherever I press the left mouse button using opengl/glut. My program runs perfectly except for the part where it does not draw the square where I click the left mouse button :). Can someone point out what I am doing wrong?

#include <stdlib.h> 
#include <glut.h>

GLsizei WIDTH = 1300, HEIGHT = 700;
GLsizei MOUSEx, MOUSEy;
GLfloat SIDE=1;

GLfloat RED[3] = {1,0,0};
GLfloat GREEN[3] = {0,1,0};
GLfloat BLUE[3] = {0,0,1};
GLfloat WHITE[3] = {1,1,1};
GLfloat BLACK[3] = {0,0,0};
GLfloat YELLOW[3] = {1,1,0};
GLfloat CYAN[3] = {0,1,1};
GLfloat MAGENTA[3] = {1,0,1};

void drawSquare(int x, int y)
{
    glColor3fv(YELLOW);
    glBegin(GL_POLYGON);
        glVertex3f(x+SIDE, y+SIDE,0);
        glVertex3f(x-SIDE, y+SIDE,0);
        glVertex3f(x-SIDE, y-SIDE,0);
        glVertex3f(x+SIDE, y-SIDE,0);
    glEnd();
    glFlush();
}

void drawSquare1()
{
    int x=0,y=0;
    glColor3fv(BLUE);
    glBegin(GL_POLYGON);
        glVertex3f(x+SIDE, y+SIDE,0);
        glVertex3f(x-SIDE, y+SIDE,0);
        glVertex3f(x-SIDE, y-SIDE,0);
        glVertex3f(x+SIDE, y-SIDE,0);
    glEnd();
    glFlush();
}

void display (void) {
    glClearColor (0.0,0.0,0.0,1.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glLoadIdentity(); 
    glTranslatef(0,0,-5);
    drawSquare1();
    glFlush();
}

void reshape (int w, int h) {
    glViewport (0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);开发者_C百科
    glMatrixMode (GL_MODELVIEW);
    WIDTH=w;
    HEIGHT=h;
}

void setX(int x)
{
    MOUSEx=x;
}

void setY(int y)
{
    MOUSEy=y;
}

void mouse(int btn, int state, int x, int y)
{
    if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)   
    {
        setX(x);
        setY(y);
        drawSquare(MOUSEx,HEIGHT-MOUSEy);
        glutPostRedisplay();
    }
    if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)   
    {
        exit(1);
    }
}

int main (int argc, char **argv) {
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize (WIDTH, HEIGHT);
    glutInitWindowPosition (10, 10);
    glutCreateWindow ("New Window");
    glutDisplayFunc (display);
    glutReshapeFunc (reshape);
    glutMouseFunc(mouse);
    //glutMotionFunc(drawSquare);
    glutMainLoop ();
    return 0;
}


In short words: OpenGL is not a scene graph. That means that those drawing commands issued in the mouse handler don't create some kind of "persistency".

Instead clicking the mouse you should store the position in a list/array and draw the squares from the values in that list in the display function.


I am fresh to this Coding But I done it.

Here is My Code It will Work.

#include <GL/glut.h>
GLsizei MOUSEx=0, MOUSEy=0;
GLfloat SIDE=50;
GLfloat BLUE[3] = {0,0,1};

void drawSquare1()
{
    glColor3fv(BLUE);
    glBegin(GL_POLYGON);
        glVertex3f(MOUSEx, MOUSEy,0);
        glVertex3f(MOUSEx+SIDE, MOUSEy,0);
        glVertex3f(MOUSEx+SIDE, MOUSEy+SIDE,0);
        glVertex3f(MOUSEx, MOUSEy+SIDE,0);
    glEnd();
    glFlush();
}   

void display(void)
{   
    glClearColor (0.0,0.0,0.0,1.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glLoadIdentity(); 
    drawSquare1();
    glFlush();
}
void reshape(int w, int h)
{   
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
     //gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
    glOrtho(0.0,1368,768,0,-1.0,1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void spindisplay(void)
{       
    glutPostRedisplay();
}

void setX(int x)
{
    MOUSEx=x;
}

void setY(int y)
{
    MOUSEy=y;
}
void mouse(int btn, int state, int x, int y)
{
    if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)   
    {
        setX(x);
        setY(y);
        //drawSquare(MOUSEx,HEIGHT-MOUSEy);
        glutPostRedisplay();
    }
    if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)   
    {
        exit(1);   // To Exit the Program
    }
}
int main(int argc, char **argv)
{   glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(1366,768);
    glutInitWindowPosition(0,0);
    glutCreateWindow("Moving squares");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutIdleFunc(spindisplay);
    glutMainLoop();
}


Below is the sample code taken from OpenGL Projects. Try to execute this and I think the problem with your drawing squares in OpenGL would be solve easily. If any question kindly ask.

#include<stdlib.h>
    #include<glut.h>
    GLsizei wh=500,ww=500;
    GLfloat size=3.0;

    void display()
    {
    glFlush();
    }

    void myInit()
    {
        glViewport(0,0,ww,wh);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0,(GLdouble)ww,0.0,(GLdouble)wh);
        glMatrixMode(GL_MODELVIEW);
        glClearColor(0.0,0.0,0.0,1.0);
        glColor3f(1.0,0.0,0.0);
    }

    void myReshape(GLsizei w,GLsizei h)
    {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glViewport(0,0,w,h);
        ww=w;
        wh=h;
    }

    void drawSquare(int x,int y)
    {

        y=wh-y;
        glBegin(GL_POLYGON);
        glVertex2f(x+size,y+size);
        glVertex2f(x-size,y+size);
        glVertex2f(x-size,y-size);
        glVertex2f(x+size,y-size);
        glEnd();
        glFlush();

    }

    void size_menu(int id)
    {
        switch(id)
        {
        case 2: size=size*2;
                break;
        case 3:if(size>1) size=size/2;
        break;
        }
        glutPostRedisplay();
    }

    void top_menu(int id)
    {
        switch(id)
        {
        case 1:exit(0);break;
        }
        glutPostRedisplay();
    }

    void myMouse(int button,int state,int x,int y)
    {
        if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)
        drawSquare(x,y);
        if(button==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)
            exit(0);
    }

    int main(int argc,char **argv)
    {
        int sub_menu;
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
        glutInitWindowSize(500,500);
        glutCreateWindow("Hierarchical Menus to Draw Squares");
        glutDisplayFunc(display);
        myInit();
        glutMouseFunc(myMouse);
        sub_menu=glutCreateMenu(size_menu);
        glutAddMenuEntry("Increase Square Size",2);
        glutAddMenuEntry("Decrease Square Size",3);
        glutCreateMenu(top_menu);
        glutAddMenuEntry("Quit",1);
        glutAddSubMenu("Resize",sub_menu);
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        glutReshapeFunc(myReshape);
        glClear(GL_COLOR_BUFFER_BIT);
        glutMainLoop();
        return 0;
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜