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);