C++ 在按下和释放鼠标时绘制矩形,opengl
我试图从用户输入中绘制一个矩形,从左键单击中收集x1,y1坐标,然后从左键单击的释放中指定x2,y2。我成功地保存了基于此鼠标操作的坐标(基于cout您没有设置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
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;
}