Как сделать OpenGl (GLUT) rotate-Animation? - PullRequest
1 голос
/ 05 января 2012

Я создал игровое поле, и оно поворачивалось бы на 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 ();
}

Ответы [ 2 ]

1 голос
/ 05 января 2012

glRotatef(1, 0, 1, 0); Я полагаю, что это опечатка и где-то должно быть i?

Ваш вызов glRotate () сбрасывается с помощью beign с помощью части вашего кода дисплея - openGL - это конечный автомат, каждый раз, когда выизменяйте все, что «залипает», пока что-то не изменится.

Было бы лучше иметь переменную угла, которую вы обновляете в процедуре рисования

0 голосов
/ 05 января 2012
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 (хорошо).Поэтому вместо этого установите переменную и поместите этот поворот в путь рисования.

...