我正在尝试创建一个多边形并在释放鼠标按钮时平移/旋转它。
如果我使用glBegin
和glEnd
重新绘制整个多边形,我可以这样做但我不确定我是否真的需要这个,因为我已经在屏幕上绘制了一次多边形而只是想要使用相同的对象并对其应用旋转/平移。
我在下面放一个片段。
if(state == GLUT_UP){
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(90,0,0,1);
// glTranslatef(50,-50,0);
/*
glBegin(GL_POLYGON);
glVertex2i (-40,40) ; //Specify li ne - se gme nt ge ometry .
glVertex2i (-30 , -40) ;
glVertex2i (0 , 20) ;
glVertex2i (40 , 35) ;
glEnd() ;
*/
glClear(GL_COLOR_BUFFER_BIT);
glPopMatrix();
glutSwapBuffers();
// glutPostRedisplay();
}
答案 0 :(得分:12)
请与我联系:“我再也不会将OpenGL绘图调用放入事件处理程序中了!”
在事件处理程序中,根据事件设置一些变量,然后发出重绘调用,并在渲染函数中根据变量的内容进行绘制。
OpenGL也不会“记住”你画的内容。你发送绘图命令,OpenGL做它的行为,然后忘记它。剩下的唯一痕迹是转向帧缓冲区上像素的片段。但帧缓冲内容不受转换或任何OpenGL状态更改的影响。只有绘图会影响帧缓冲。
答案 1 :(得分:0)
您不需要再次编写整个代码:
在你的显示功能中(你用作参数来将回调注册到过剩窗口的glutDisplayFunc(display)
相同的void函数)将你的代码片段放在上面。
在glPushMatrix()
.. glPopMatrix()
序列中,在GLfloat
调用中放入一个变量(最好是glRotatef()
类型)角度以及旋转轴。您可以对glRotatef()
参数执行相同的操作。
如果您想使用鼠标或键盘旋转或翻译,请使用glutMouseFunc()
或glutKeyboardFunc()
向GLUT注册回调。如果您想要动画,则可以使用glutIdleFunc()
注册一个函数。
代码段将是:
void handler(...){
angle+=some_value;
//angle reset not so necessary but good,
if you somehow are using that angle value somewhere else
if(angle>360)
angle=0;
glutPostRediplay();
}
键盘:
handler(unsigned char key, int x, int y);
小鼠
handler(int button, int state, int x, int y);
空闲功能(用于连续动画)
handler(void);