2010-02-02 13 views
6

¿Cómo controlas la velocidad de una animación? Mis objetos se animan más rápido en la máquina de otro.¿Cómo se asegura de que la velocidad de la animación OpenGL sea consistente en diferentes máquinas?

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; 
} 

Respuesta

10

Esta es la solución de los pobres:

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

esta es la mejor solución:

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

En la primera, GetFrame mueve el objeto en una cantidad fija, sino que se es propenso a errores si cae la tasa de fotogramas.

En este último, mueve los objetos según el tiempo transcurrido. P.ej. si pasan 20 ms, rotará un objeto 12 grados, y si pasan 10 ms, lo gira 6 grados. En general, la animación si se pasa una función de tiempo.

Implementación de getticks() es decisión suya. Para empezar, puede usar glutGet(GLUT_ELAPSED_TIME).


En su caso se vería algo así como:

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; 
    } 
    } 
} 
Cuestiones relacionadas