2010-02-02 6 views
6

Come si controlla la velocità di un'animazione? I miei oggetti si animano più velocemente sulla macchina di un altro.Come ci si assicura che la velocità dell'animazione OpenGL sia coerente su macchine diverse?

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

risposta

10

Questa è la soluzione del povero:

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

questa è la soluzione migliore:

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

Nella prima, getframe sposta l'oggetto di una quantità fissa, ma che è soggetto a errori se il framerate diminuisce.

In quest'ultimo si spostano gli oggetti in base al tempo trascorso. Per esempio. se passano 20ms, ruoti un oggetto di 12 gradi e, se passi 10ms, lo fai ruotare di 6 gradi. In generale, l'animazione se passava una funzione del tempo.

L'implementazione di getticks() dipende da voi. Per cominciare potresti usare glutGet(GLUT_ELAPSED_TIME).


Nel tuo caso sarebbe simile:

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