2012-01-04 80 views
0

我做了一个比赛场地,它会旋转180度。 不幸的是,你看不到它变得越来越慢。 我只看到最后的“扭曲”。如何制作一个OpenGl(GLUT)旋转动画?

/** 
@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(); 
} 
+0

一个类似的问题,它为我工作[stackoverflow.com/questions/20396485/how-to-animate-a-rotation-triggered-by-a-key-in-opengl-and-glut](http:/ /stackoverflow.com/questions/20396485/how-to-animate-a-rotation-triggered-by-a-key-in-opengl-and-glut#) – 2017-05-08 10:11:09

回答

0

glRotatef(1, 0, 1, 0);我认为这是一个错字,应该有一个i地方?你调用glRotate()会被你的显示代码的一部分重新设置 - openGL是一个状态机,每次你改变它“粘”的东西,直到其他的改变。

这将是最好有您在抽签程序

+0

是的,它的工作原理。谢谢:)我怎么能给你一个明星或类似的东西? – Furtano 2012-01-05 00:28:48

0
void flipGamefield180degree(){ 
    for (int i = 0; i < 180; i++){ 
     glRotatef(1, 0, 1, 0); 
     glutPostRedisplay(); 
     Sleep(20); 
    } 
} 

问题1更新的角度变量:glutPostRedisplay()只队列显示事件,它实际上并没有执行画画。解决方案:使用不断调用glutPostRedisplay的空闲函数(如果正在运行动画)并使用系统时间执行动画。

问题2:OpenGL是一个有状态的绘图API,而不是场景图。由于你从glLoadIdentity(good)开始,所以循环中的一个glRotate不会进入绘图状态。因此,请设置一个变量,并将该旋转放入绘图路径中。

+0

现在我有另一个问题。我只能使用转动动画1x。 空隙flipGamefield180degree(){ \t \t \t 如果(flipangle <180){ \t \t COUT << “1 \ n” 个; \t \t \t flipangle + = 1; \t \t \t glRotatef(flipangle,0,1,0); \t \t \t glutPostRedisplay(); \t \t \t睡眠(10); \t} \t否则{ \t \t glRotatef(180,0,1,0); \t \t \t } \t \t \t } .... 空隙显示器(空隙){ 如果(flip180degree){ \t flipGamefield180degree(); } } – Furtano 2012-01-05 00:47:36