TD3 : Déformations du modèle, FFD
Contenu du TD
Free-Form Deformations
Le squelette de programme fourni contient les procédures pour charger et afficher trois modèles (le pingouin, la théière et un cube). Pour chaque modèle, il calcule et stocke la boite englobante (bb[model][MIN/MAX][0/1/2]).Il trace également une grille de points de contrôle (drawGrid()).
Vous pourrez également expérimenter avec le code pour les Function-Based Deformations (qui contient aussi le code de tracé des splines, des courbes de Bézier et des courbes de subdivision).
Les deux programmes partagent le code de gestion de
la trackball avec le TD1. Pour cette raison, le
dossier TD3
doit se trouver au même niveau hiérarchique
que les dossiers TD1
et
common
(qui provient du TD1).
Travail Dirigé
Pour le TD 3, vous devez implémenter une déformation des modèles en utilisant des FFD.
Dans le programme :
- les 104 premières lignes représentent les données nécessaires pour stocker le modèle du pingouin, et les coordonnées des points de contrôle de la théière.
- la structure
bb
stocke la boite englobante des modèle (bb[TEAPOT][MAX][0] contient par exemple le maximum en X de la théière). bb est mis à jour parloadModel()
. grid
est la grille des points de contrôle. Elle est initialisée à une position neutre. Il vous appartiendra de la modifier.loadModel()
se charge de charger les 30000 faces du pingouin, et d'initialiser les boites englobantes pour tous les modèles.initGrid()
initialise la grille des points de contrôle à une position neutre.drawGrid()
trace la grille des points de contrôle.transform(float* input, float* output)
est la fonction de base, que vous devez écrire. Elle est appelée pour chaque point du modèle, et elle applique à ce point la transformation calculée, en fonction de sa position dans la grille et des coordonnées des points de contrôle.drawObject()
se charge de dessiner les modèles. Pour chaque point géométrique, il fait appel àtransform
avant de l'envoyer.mouse
etmotion
sont appelées quand un bouton de la souris est enfoncé et quand la souris se déplace avec un bouton enfoncé. Elles se chargent du déplacement du point de vue et du déplacement des points de contrôle.parsekey
etparsekey_special
sont chargées des entrées au clavier.- le reste du programme suit une structure assez classique, et donc bien connue.
Accélérations
Vous pouvez constater que le programme est assez rapide tant qu'il ne s'agit que de représenter la théière ou le cube, mais assez lent pour le modèle du pingouin. Cela vient du fait qu'on calcule les transformations sur le modèle à chaque image.OpenGL propose un mécanisme permettant de stocker une série d'ordres graphiques, les display lists. On va s'en servir pour éviter de tout recalculer à chaque image, mais seulement lorsque le modèle change.
displayList = glGenLists(1);
demande à la librairie de préparer une display list, et stocke son numéro dans leGLuint
displayList.glNewList(displayList, GL_COMPILE);
donne le début des ordre graphiques à stocker dans la display list.glEndList();
donne la fin des ordres graphiques à stocker dans la display list.glCallList(displayList);
appelle la display list et l'affiche à l'écran.
Avec cette série d'ordres, vous devriez observer une accélération de l'affichage. Vous pouvez aussi représenter la grille de points de contrôle en temps réel, et ne modifier le modèle que lorsque l'utilisateur a relâché la souris.