2012-07-29 2 views
1

Chers tous, J'essaie de créer une animation en utilisant OpenGL via glutIdleFunc(). Ci-dessous est mon code:Comment ralentir la vitesse d'animation de glutIdleFunc

float t = 0.0; 

void idle (void) 
{ 
    t += 0.1; 
    if (t > 2*pi) 
    { 
     t = 0.0; 
    } 
    glutPostRedisplay(); 
} 

//in main function 
glutIdleFunc(idle); 

J'ai essayé d'ajuster l'incrément de t afin de ralentir mon animation. Mais d'une manière ou d'une autre, mon animation continue à avancer trop vite, jusqu'à ce que je ne puisse plus l'attraper avec mes yeux. Est-ce que quelqu'un sait comment ralentir ce genre d'animation? Merci

Répondre

2

Plutôt que d'essayer de trouver une valeur t artificielle à utiliser dans votre fonction inactive, il vaudra probablement mieux utiliser une minuterie réelle telle que time(). Ensuite, avancez simplement votre animation de la quantité appropriée compte tenu du temps écoulé depuis la dernière image.

Voilà comment cela pourrait ressembler:

time_t lastTime; 

void draw() { 
    const time_t now = time(); 
    const double dt_s = difftime(now, lastTime); 

    // Update your frame based on the elapsed time. For example, update an angle 
    // based on a specified rotation rate (omega_deg_s): 
    const double omega_deg_s = 10.0; 
    angle += dt_s * omega_deg_s; 
    angle = fmod(angle, 360.0); 

    // Now draw something based on the new angle info: 
    draw_my_scene(angle); 

    // Record current time for next time: 
    lastTime = now; 
} 
+0

Pouvez-vous me montrer un petit exemple sur la façon de faire cela? – rofans91

+0

@rofansmanao: Bien sûr. Juste ajouté un. La clé consiste à utiliser des informations de débit, plutôt que de simples valeurs d'incrément absolues. –

+0

GLUT a son propre temps à obtenir une fonction qui fonctionne très bien aussi. –

2

Vous devez utiliser le temps écoulé depuis le dernier appel de fonction plutôt qu'une valeur droite comme métrique, depuis ce temps peut varier.
Pour plus d'informations, lisez valkea's answer on GameDev, ce qui suggère que vous utilisez glutGet(GLUT_ELAPSED_TIME) pour calculer cette valeur.