在鼠标位置的opengl中绘制一个正方形

时间:2011-04-21 18:27:24

标签: opengl glut

无论我使用opengl / glut按下鼠标左键,我都想画一个简单的方块。我的程序完美运行,除了它的部分绘制我点击鼠标左键的方格:)。有人可以指出我做错了吗?

#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);
    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;
}

3 个答案:

答案 0 :(得分:7)

简而言之:OpenGL不是场景图。这意味着在鼠标处理程序中发出的那些绘图命令不会创建某种“持久性”。

而是单击鼠标,您应该将位置存储在列表/数组中,并从显示功能中该列表中的值中绘制方块。

答案 1 :(得分:4)

我对这个编码很新鲜但是我做到了。

这是我的代码它将起作用。

#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();
}

答案 2 :(得分:1)

以下是从OpenGL Projects获取的示例代码。尝试执行此操作,我认为OpenGL中的绘图方块的问题很容易解决。如果有任何问题请问。

#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;
    }