Sujet : [OpenGL] faire une rotation d'une scene proprement selon MSDN |
MC |
De plus la méthode "j'incremente de 1° a chaque frame" est daubique a point: entre une TNT1 et une GeForce2 Ultra tu auras une sacré difference de vitesse de rotation!
Donc la méthode de la rotation fixe + incrémentation de l'angle par un timer, avec glut tu as le choix entre un timer (po terrible) ou de faire ca dans la fonction idle avec lecture du temps, dans ce cas tu ne fait pas un redisplay a la fin de la trame mais plutot a chaque update dans la fonction idle (si tu veux un framerate fixe). De cette facon tu peux fixer le framerate ET la vitesse de rotation de facon independante... |
Pitounet |
En gros, tu as 2 solution pour faire un animation de rotation:
void display (void) { glClearColor (0.0, 0.0, 0.0, 0.0); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glRotatef(angle, 0.0, 1.0, 0.0); //avec un angle qui ne change pas et qui représente la pas de ta rotation
glBegin(GL_LINES); //le boulot commence ici pour OpenGL ! ...
}
ou alors
void display (void) { glClearColor (0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(angle, 0.0, 1.0, 0.0); //avec un angle qui change (c'est l'angle globale de ta rotation)
glBegin(GL_LINES); //le boulot commence ici pour OpenGL ! ...
}
Le problème, quand tu utilise la première méthode, c'est que tu va faire des multiplications de matrice qui contiennent de + en + d'erreurs d'arrondis... Il vaut donc mieux avoir un angle globale, qui tu incrémente entre chaque frame, et repartir d'une matrice vide avant chaque dessin .
J'espère que j'ai été sufisemment explicatif (je ne suis pas un super pro en OpenGL, je débute aussi). --Message édité par Pitounet-- |
Fraaargh |
Hi 'vrybody !
Juste une petitte question d'un chti debutant en OpenGL:
Pour l'instant, j'utilise GLUT pour afficher une pauvre scene et la faire tourner.
Pour cela, j'ai défini une variable globale, mon angle, que j'incrémente à chaque passage dans ma fonction d'affichage.
Voici la partie interressante du code:
GLfloat angle = 0;
void display (void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
glRotatef(angle, 0.0, 1.0, 0.0);
angle+=0.1;
glBegin(GL_LINES);ss//le boulot commence ici pour OpenGL !
Or, en parcourant MSDN, je suis tombé là dessus, je cite:"Do not make extensive changes to a single matrix. For example, do not animate a rotation by continually calling glRotate with an incremental angle. Rather, use glLoadIdentity to initialize the given matrix for each frame, and then call glRotate with the desired complete angle for that frame."
Le probleme, c'est que je ne saisi pas trop bien ce qu'ils veulent dire ! Moi, ce que je fais, c'est bien ou pas ? Je débute donc je voudrais pas prendre de mauvaises habitudes !!! |