如何制作 OpenGL (GLUT) 旋转动画?

Posted

技术标签:

【中文标题】如何制作 OpenGL (GLUT) 旋转动画?【英文标题】:How to make a OpenGl (GLUT) rotate-Animation? 【发布时间】:2012-01-04 23:44:48 【问题描述】:

我做了一个运动场,它会旋转 180 度。 不幸的是,您看不到它变得越来越慢。 我只看到了最后的“转折”。

/**
@brief Rotates the Gamefield 180° with an turn animaion
*/
void flipGamefield180degree ()
        for (int i = 0; i < 180; i++)
            glRotatef(1, 0, 1, 0);
            glutPostRedisplay();
            Sleep(20);
        



void display(void)


    // Löscht den Bildschirm
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   // Zeichenfarbe setzen  
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();             

   // _,_,_ wo steht die Kamera, _,_,_ wo hin, wo ist oben?
   gluLookAt (0.0, 0.0, 10, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);


   // Rotation X-Achse
   rotating(0);
   // Rotation Y-Achse
   rotating(1);
   // Rotation Z-Achse
   rotating(2);

   if (flip180degree)
       flipGamefield180degree();
   

   /*glRotatef(15,0,1,0);
   glRotatef(-15,1,0,0);
   */

   glTranslatef(-5.5, -6 ,0);
   glPushMatrix();
   drawGameField(false, 10);
   glPopMatrix();

   glPushMatrix();
   glTranslatef(11, 0 ,0);
   glPushMatrix();
   drawGameField(true, 10);
   glPopMatrix();
   glPopMatrix();

   //drawShipOnField(s1, feldSpieler);
   drawShipOnField(s1, feldSpieler);

   //glDisable(GL_LIGHTING);
   /*glColor3f(0, 0, 1); 
   glutSolidCube(1);
   glEnable(GL_LIGHTING);*/
  /* glTranslatef(5, 0, 0);
   drawGameField(true, 10);*/
   //glutSolidTeapot(1.0);


   //glRotatef(30,1.0,0.0,0.0);






   glFlush ();

【问题讨论】:

一个类似的问题,它对我有用***.com/questions/20396485/how-to-animate-a-rotation-triggered-by-a-key-in-opengl-and-glut 【参考方案1】:

glRotatef(1, 0, 1, 0); 我认为这是一个错字,应该在某处有一个i

您对 glRotate() 的调用由您的显示代码的一部分重新设置 - openGL 是一个状态机,每次您更改任何内容时,它都会“粘住”,直到其他内容发生变化。

最好有一个在绘图例程中更新的角度变量

【讨论】:

是的,行得通。谢谢 :) 我怎样才能给你一颗星或类似的东西?【参考方案2】:
void flipGamefield180degree ()
    for (int i = 0; i < 180; i++)
        glRotatef(1, 0, 1, 0);
        glutPostRedisplay();
        Sleep(20);
    

问题 1:glutPostRedisplay() 仅对显示事件进行排队,它实际上并不执行绘图。解决方法:使用一个不断调用 glutPostRedisplay 的空闲函数(如果动画正在运行),并使用系统时间来做动画。

问题 2:OpenGL 是一个有状态的绘图 API,而不是场景图。循环中的那个 glRotate 不会使其进入绘图状态,因为您从 glLoadIdentity (好)开始。所以改为设置一个变量,并将该旋转放入绘图路径中。

【讨论】:

现在我有另一个问题。我只能使用 1x 的转弯动画。 void flipGamefield180degree () if (flipangle

以上是关于如何制作 OpenGL (GLUT) 旋转动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 glut 和 openGL 改变颜色?

OpenGL之路制作旋转飞机模型

OpenGL Glut 特殊键

使用键盘旋转 -- glut / OpenGL

鼠标点击开始动画 OpenGL/GLUT C++

OpenGL/GLUT GL_LINES 的光照不正确