C++ 在按下和释放鼠标时绘制矩形,opengl

C++ 在按下和释放鼠标时绘制矩形,opengl,c++,opengl,mouseevent,glut,C++,Opengl,Mouseevent,Glut,我试图从用户输入中绘制一个矩形,从左键单击中收集x1,y1坐标,然后从左键单击的释放中指定x2,y2。我成功地保存了基于此鼠标操作的坐标(基于cout您没有设置GL\u投影矩阵。我不确定默认值是什么(可能是标识矩阵),但它肯定不是您在display()中假设的Y翻转像素比例坐标系 试着这样做: #include <GL/glut.h> struct Position { Position() : x(0), y(0) {} float x, y; }; Posit

我试图从用户输入中绘制一个矩形,从左键单击中收集x1,y1坐标,然后从左键单击的释放中指定x2,y2。我成功地保存了基于此鼠标操作的坐标(基于cout您没有设置
GL\u投影
矩阵。我不确定默认值是什么(可能是标识矩阵),但它肯定不是您在
display()
中假设的Y翻转像素比例坐标系

试着这样做:

#include <GL/glut.h>

struct Position
{
    Position() : x(0), y(0) {}
    float x, y;
};

Position start, finish;
void mouse( int button, int state, int x, int y )
{
    if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN )
    {
        start.x = finish.x = x;
        start.y = finish.y = y;
    }
    if( button == GLUT_LEFT_BUTTON && state == GLUT_UP)
    {
        finish.x=x;
        finish.y=y;
    }
    glutPostRedisplay();
}

void motion( int x, int y )
{
    finish.x = x;
    finish.y = y;
    glutPostRedisplay();
}

void display()
{
    glClearColor( 0, 0, 0, 1 );
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    glOrtho( 0, w, h, 0, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glPushMatrix();
    glColor3f(1,1,0);
    glBegin(GL_QUADS);
        glVertex2f(start.x,start.y);
        glVertex2f(finish.x,start.y);
        glVertex2f(finish.x,finish.y);
        glVertex2f(start.x,finish.y);
    glEnd();
    glPopMatrix();

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100,100);
    glutCreateWindow("GLUT");
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();
    return 0;
}
#包括
结构位置
{
位置():x(0),y(0){}
浮动x,y;
};
位置开始,结束;
无效鼠标(int按钮、int状态、int x、int y)
{
如果(按钮==GLUT\U LEFT\U按钮和状态==GLUT\U DOWN)
{
开始。x=结束。x=x;
start.y=finish.y=y;
}
如果(按钮==GLUT\U LEFT\U按钮和状态==GLUT\U UP)
{
完成。x=x;
完成。y=y;
}
再发现();
}
无效运动(整数x,整数y)
{
完成。x=x;
完成。y=y;
再发现();
}
无效显示()
{
glClearColor(0,0,0,1);
glClear(GLU颜色缓冲位);
glMatrixMode(GL_投影);
glLoadIdentity();
双w=glutGet(GLUT\U窗口\U宽度);
双h=glutGet(GLUT\U窗口\U高度);
格洛托(0,w,h,0,-1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glPushMatrix();
gl3f(1,1,0);
glBegin(GL_QUADS);
glVertex2f(start.x,start.y);
glVertex2f(finish.x,start.y);
glVertex2f(finish.x,finish.y);
glVertex2f(开始x,结束y);
格伦德();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(640480);
位置(100100);
GLUT(GLUT);
glutMouseFunc(小鼠);
glutMotionFunc(运动);
glutDisplayFunc(显示器);
glutMainLoop();
返回0;
}
中的“SC”很重要。请将所有预期的功能和结构定义纳入其中。
#include <GL/glut.h>

struct Position
{
    Position() : x(0), y(0) {}
    float x, y;
};

Position start, finish;
void mouse( int button, int state, int x, int y )
{
    if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN )
    {
        start.x = finish.x = x;
        start.y = finish.y = y;
    }
    if( button == GLUT_LEFT_BUTTON && state == GLUT_UP)
    {
        finish.x=x;
        finish.y=y;
    }
    glutPostRedisplay();
}

void motion( int x, int y )
{
    finish.x = x;
    finish.y = y;
    glutPostRedisplay();
}

void display()
{
    glClearColor( 0, 0, 0, 1 );
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    glOrtho( 0, w, h, 0, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glPushMatrix();
    glColor3f(1,1,0);
    glBegin(GL_QUADS);
        glVertex2f(start.x,start.y);
        glVertex2f(finish.x,start.y);
        glVertex2f(finish.x,finish.y);
        glVertex2f(start.x,finish.y);
    glEnd();
    glPopMatrix();

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100,100);
    glutCreateWindow("GLUT");
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();
    return 0;
}