Un modèle hiérarchique permet de décrire facilement des objets complexes composés d'objets simples. La scène est organisée dans un arbre tel que les objets ne sont plus définis par leur transformation absolue par rapport au repère de toute la scène, mais par leur transformation relative dans cet arbre.
Comme un même objet peut être inclus plusieurs fois dans la hiérarchie, la structure de données est un
Graphe Orienté Acyclique (DAG)
A chaque noeud est associé un repère. Le repère associé à la racine est le repère de la scène.
A chaque arc est associé une transformation géométrique qui positionne l'objet fils dans le repère de son
père.
OpenGL utilise les coordonnées homogènes pour manipuler ses objets (cf Math). Il maintient trois matrices 4x4 distinctes pour contenir les différentes transformations.
Pour coder l'arbre de description de la scène, il faut utiliser la pile de transformation, en empilant la
matrice de transformation courante (sauvegarde des caractéristiques du repère local associé) avant de descendre dans chaque noeud de
l'arbre, et en dépilant la matrice en remontant (récupération du repère local associé).
glPushMatrix() Empile la matrice courante pour sauvegarder
la transformation courante.
glPopMatrix() Dépile la matrice courante (La matrice du
haut de la pile est supprimée de la pile, et elle devient la matrice courante)
glMatrixMode(GLenum mode) spécifie quelle matrice sera affectée par les commandes suivantes de manipulation de transformations : la matrice de modélisation-vision, de projection ou de texture.
glLoadIdentity() donne à la Matrice courante la valeur identité. (comme déjà indiqué)
glLoadMatrix*(const TYPE * m) donne à la Matrice courante la valeur de la matrice m.
glMultMatrix*(const TYPE * m) multiplie la Matrice courante par la matrice m.
Repartez de la scène du TD précédent (scène comprenant une sphère rouge de rayon unité en (2,0,0),
(glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)), un cube bleu d'arête 2, tourné de 20°
autour de l'axe x du repère de toute la scène, positionné en (0,3,0), et un cube jaune tourné de -20° autour
de l'axe z du repère de la scène, positionné en (3,3,3) (glutSolidCube(GLdouble size), caméra
positionnée de manière à voir l'ensemble des objets.
Ecrivez le graphe de la scène (ou plutôt UN graphe pour la scène)
Ecrivez le programme qui affiche cette scène en utilisant la gestion de la pile des matrices.
Copiez le programme robot.cpp et complétez-la fonction paralleX(GLfloat ax, GLfloat ay, GLfloat az), afin qu'elle dessine un parallelepipède rectangle de dimensions (ax, ay, az), à partir d'un repère local situé comme sur le schéma :
Compilez et exécutez ce programme.
Faites le dessin du graphe de la scène avec toutes les transformations.
Faites un schéma du bras du robot en indiquant les repères locaux de l'épaule (shoulder) et du coude
(elbow)
Modifiez la scène en ajoutant trois doigts (index,
majeur, et pouce en opposition) au bras du robot, chaque doigt étant composé de deux segments. Faites le
dessin du nouveau graphe, et le schéma du bras complet.
Modifiez le programme en conséquent. Chaque
élément doit être mobile de manière indépendante
et doit être animable par l'utilisateur au travers du clavier.
Quels types de transformation utilisez-vous ?
Combien de degrés de libertés possède alors le bras ?
Ajoutez un degré de rotation du poignet : suivant l'axe du bras.