opengl - 在opengl中在鼠标位置画一个正方形

标签 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;
}

最佳答案

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

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

关于opengl - 在opengl中在鼠标位置画一个正方形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748236/

相关文章:

macos - 通过带有 Rust FFI 的 GLUT 打开的窗口卡住

c++ - 另一个基本的 VBO 设置

OpenGL 将盒子从里到外渲染

c++ - 对 VBO 中的特定三角形使用不同的纹理

linux - GLUT 键盘 react 迟钝

c++ - 分离圆环中的三角带

c++ - GLUT 键盘事件

math - 如何根据共享顶点的多个三角形计算法向量?

opengl - 如何在 STL 算法中使用 glm 的 operator==?

opengl - X失败的请求: BadMatch错误