Initialiser ou restaurer une matrice OpenGL pour Windows
Vous avez pu voir dans le chapitre sur les transformations qu'il pouvait y avoir des problèmes d'accumulation des opérations de transformations sur les matrices. Car les transformations sont faites sur la matrice courante et non sur un objet précis. Ce qui peut être gênant pour les objets sur lesquels vous ne vouliez pas effectuer cette transformation.
Une solution consiste à réinitialiser la matrice via glLoadIdentity();
Cependant, si vous aviez effectué des transformations d'ordres générales càd des transformations que tous les objets doivent subir, vous ne voulez pas forcement refaire ces transformations à chaque fois. Imaginons un bateau à hélice par exemple qui subi une transformation le faisant s'incliner, nous pouvons dès le début indiquer au repère cette inclinaison, ceci afin que tous les objets représentants ce bateau subissent cette inclinaison. Par contre, l'hélice qui tourne sera le seul objet à devoir tourner !
Une solution pourrait être de dessiner l'hélice en dernier... D'accord, mais si je complique en disant qu'en plus, il y a un drapeau qui flotte au vent, ce drapeau, je le dessine où ???
La solution sera de faire:
- Mémoriser l'état de la matrice qui a subi l'inclinaison,
- Puis dessiner tous mes objets inclinés.
- Effectuer la rotation de la matrice
- Puis dessiner l'hélice
- Restaurer la matrice dans son état incliné (il le faut, nous venons de faire une rotation du repère pour faire tourner l'hélice et le drapeau n'ont pas à subir cette rotation !).
- Je peux maintenant dessiner le drapeau car son mât sera lui aussi incliné !
L'idée est donc de mémoriser la matrice dans une pile.
Il y a la pile pour le model view qui a une taille de 32 éléments. Cette taille ne sera plus que de 2 pour les autres matrices.
Les fonctions permettant de gérer cette pile se nomment :
void glPushMatrix(
void
);
pour mémoriser la matrice dans la pile
et
void glPopMatrix(
void
);
pour restaurer la matrice et dépiler la pile
Ces deux fonctions pouvant retourner des erreurs: GL_STACK_OVERFLOW, GL_STACKUNDERFLOW ou GL_INVALID_OPERATION si exécutées entre glBegin et glEnd.
D'où l'exemple de lancé de classeurs du chapitre sur les transformations revu et corrigé:
Mémorisation de la matrice dans la pile avant de lancer le premier classeur. Puis restauration de la matrice et lancement du second classeur.
Annexes
OpenGL pour Linux, Windows, Android...