如何确保OpenGL动画在不同机器上的速度一致?

问题描述:

你如何控制动画的速度?我的物体在另一台机器上的动画速度更快。如何确保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; 
} 

这是穷人的解决方案:

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固定量,移动你的对象,但如果帧率下降,则容易出错。

在后者中,您将根据时间过去移动对象。例如。如果20ms通过,则将对象旋转12度,如果通过10ms,则将其旋转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; 
    } 
    } 
}