OpenGL glTranslatef/glRotatef没有像我预期的那样工作
我正在尝试创建一个多边形,并在释放鼠标按钮时平移/旋转它。 如果我使用OpenGL glTranslatef/glRotatef没有像我预期的那样工作,opengl,Opengl,我正在尝试创建一个多边形,并在释放鼠标按钮时平移/旋转它。 如果我使用glBegin和glEnd重新绘制整个多边形,我可以做到这一点,但我不确定我是否真的需要,因为我已经在屏幕上绘制了一次多边形,只想使用同一个对象并对其应用旋转/平移 我在下面放了一个片段 if(state == GLUT_UP){ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); glPush
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();
}
请告诉我:“我再也不会将OpenGL绘图调用放入事件处理程序了!” 在事件处理程序中,根据事件设置一些变量,然后发出重画调用,并在呈现函数中根据变量的内容绘制 更新:
而且OpenGL不会“重画”你画的东西。你发送绘图命令,OpenGL完成它的任务,然后忘记它。剩下的唯一轨迹是帧缓冲区上变为像素的片段。但是帧缓冲区内容不受转换或任何OpenGL状态更改的影响。只有绘图会影响帧缓冲区。无需再次编写整个代码: 在display函数(作为参数将对glut窗口的回调注册为
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);
空闲功能(用于连续动画)
你真的需要再次绘制它,除非你只想旋转最后创建的图像,但是你需要在四边形上绘制该图像并旋转它。我认为你应该阅读更多关于GL的基础知识,因为你似乎有误解。谢谢。事实上,我想使用上次创建的相同图像。请你解释一下“在四边形上为该图像加暗”是什么意思。谢谢。因此,如果我想从先前旋转的状态旋转图像,我如何使用OpenGL做到这一点。@code4fun:您重新绘制了整个内容,但应用了更改。这就是OpenGL应该如何使用的。现代GPU每秒可以处理数百万个三角形。对于现代GPU来说,为多边形重新绘制一手三角形是不需要努力的。您必须了解的是,OpenGL没有“对象”的概念。它所看到的只是绘制单个点、线或三角形的调用。它画了一个点、一条线或一个三角形,然后马上就忘记了。
handler(void);