Как вы убедитесь, что скорость анимации OpenGL согласована на разных машинах?

Как вы контролируете скорость анимации? Мои объекты быстрее оживают на чужой машине.

void idle(void){

if (!wantPause){    
    circleSpin = circleSpin + 2.0;      //spin circles
    if(circleSpin > 360.0)
{
        circleSpin = circleSpin - 360.0;
}

        diamondSpin = diamondSpin - 4.0;    //spin diamonds
    if(diamondSpin > 360.0)
{
        diamondSpin = diamondSpin + 360.0;
}
        ellipseScale = ellipseScale + 0.1;  //scale ellipse
    if(ellipseScale > 30)
{
        ellipseScale = 15;
}
glutPostRedisplay();
}
}

void drawScene()
{
 ...
glColor3f(1,0,0);
glPushMatrix();
glRotatef(circleSpin,0,0,1);
drawOuterCircles();
glPopMatrix();
}


int main (int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowSize(400,400);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Lesson 6");
init();
glutDisplayFunc(drawScene);
glutKeyboardFunc(keyboard);
glutReshapeFunc(handleResize);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}

1 ответов


вот решение бедняка:

FPS = 60.0;
while (game_loop) {
    int t = getticks();
    if ((t - t_prev) > 1000/FPS)
        process_animation_tick();
    t_prev = t;
}

это лучшее решение:

GAME_SPEED = ...
while (game_loop) {
    int t = getticks();
    process_animation((t - t_prev)*GAME_SPEED/1000.0);
    t_prev = t;
}

в первом getframe перемещает ваш объект на фиксированную величину, но это подвержено ошибкам, если частота кадров падает.

в последнем случае вы перемещаете объекты на основе прошедшего времени. Е. Г. если 20мс пройти, вы вращаете объект 12 градусов, и если 10мс пройти, вы поворачиваете его на 6 градусов. В общем, анимация если функция времени пройденный.

реализация getticks() - Это зависит от вас. Для начала вы можете использовать glutGet(GLUT_ELAPSED_TIME).


в вашем случае это будет выглядеть примерно так:

int old_t;

void idle(void) {
  int t = glutGet(GLUT_ELAPSED_TIME);
  int passed = t - old_t;
  old_t = t;
  animate( passed );
  glutPostRedisplay();
}

void animate( int ms )
{  
  if (!wantPause){    
    circleSpin = circleSpin + ms*0.01;      //spin circles
    if(circleSpin > 360.0)
    {
      circleSpin = circleSpin - 360.0;
    }
    diamondSpin = diamondSpin - ms*0.02;    //spin diamonds
    if(diamondSpin > 360.0)
    {
        diamondSpin = diamondSpin - 360.0;
    }
    ellipseScale = ellipseScale + ms*0.001;  //scale ellipse
    if(ellipseScale > 30)
    {
        ellipseScale = 15;
    }
  }
}