TD 3 : Projections OpenGL, field-of-view, virtual trackball
Résumé du TD
Le but du TD est de tester l'influence de l'angle de vue, tester les différentes projections (orthographique, perspective), tester la différence entre translation du point de vue et angle d'ouverture et développer une trackball virtuelle.Instructions
Téléchargez et compilez le squelette de code fourni. Il affiche une théière, en perspective et en fil de fer, et contient les fonctions nécessaires pour l'interface utilisateur.
Field of View
Dans un premier temps, on va travailler l'angle d'ouverture de la caméra. Faites en sorte que quand l'utilisateur appuie sur le bouton du milieu de la souris, l'angle d'ouverture de la caméra change (en positif ou en négatif). Il fautpour celà utiliser la fonction motion et mesurer le déplacement depuis que l'utilisateur a commencé à appuyer (la différence entre currenty et starty).
Je vous propose d'ajouter le delta en y (distance parcourue verticalement sur l'écran) à l'angle d'ouverture.
Note :Si votre souris a une molette comme bouton du milieu, utilisez le bouton de droite.
Virtual trackball
On passe maintenant à la virtual trackball. Le but est de faire tourner la théière, comme si elle était portée par une boule.
L'axe et l'angle de la rotation sont définis par le début du parcours de la souris et sa position courante. Il vous faut :
- Pour chaque point, déterminer un vecteur 3D unitaire correspondant aux coordonnées (x,y) à l'écran.
- À partir de ces deux vecteurs 3D, on définit la rotation
comme suit:
- l'axe de la rotation est donné par le produit vectoriel des deux vecteurs,
- le cosinus de l'angle de rotation est donné par le produit scalaire des deux vecteurs.
- La rotation est appelée avec glRotatef(angle, axe.x, axe.y, axe.z);.
- Stockez la valeur de la dernière rotation effectuée, pour repartir du même point.
Translation
Le prochain objectif est de faire que la scène se translate quand on utilise le bouton droit de la souris. À nouveau, le vecteur de translation est défini par la distance parcourue par la souris à l'écran.Plusieurs transformations
Pour l'instant, votre trackball repart à zéro à chaque fois que vous recommencez à cliquer. Ca pose quelques problèmes en matière d'interface utilisateur...Pour améliorer ça, il faut concaténer plusieurs transformations.
glGetFloatv(GL_MODELVIEW_MATRIX, matrix); vous permet de récupérer la transformation courante (dans la bonne pile de transformation).
glMultMatrixf(matrix); vous permet de rajouter cette transformation à la transformation que vous avez calculée.