TP1 : Primitives, placement, métaphore du prommeneur

But:

Dans ce TP, vous allez faire du tracé élémentaire et manipuler les commandes de transformations matricielles (modèle / vue / projection) pour manipuler le point de vue. Le tracé ne présente pas de difficulté. La gestion du point de vue est beaoucoup plus délicate; c'est sur cet aspect que nous mettrons l'accent.

Description:

Le programme ouvre une fenêtre sur un environnement contenant une sphère tracée en fil de fer, ainsi que trois autres objets que vous devrez rajouter. Pour quitter le programme, utilisez la touche Escape.

Le plus gros du travail est d'implémenter une métaphore de navigation connue sous le nom de métaphore du prommeneur. Le prommeneur reste dans le plan horizontal, mais peut avancer, reculer, pivoter à gauche et à droite. Ces mouvements seront disponibles à partir de la souris (avec le bouton 1 enfoncé), ou à partir de certaines touches du clavier:

ActionTouche QWERTYTouche AZERTY
AvancerWZ
ReculerSS
Pivoter à gaucheQA
Pivoter à droiteEE
Pas chassé à gaucheAQ
Pas chassé à droiteDD

Pour changer la disposition de votre clavier, chercher un #define dans la section "Keyboard Management" du fichier de travail. Les pas chassés ne sont pas disponibles à la souris.

Additionnellement, la touche R (comme reset) servira à réinitialiser le point de vue à sa position d'origine.

Implémentation:

Dans le squelette que vous avez maintenant récupéré, la gestion du point de vue s'effectue grâce à trois fonctions dont vous devez écrire le contenu: viewpoint_reset(), viewpoint_translate() et viewpoint_rotate(). Ces fonctions doivent manipuler certaines structures de données relatives à la navigation que vous avez également le soin de définir. Toutes les indications nécessaires sont données en commentaire dans le code.

Pour ce qui concerne le tracé des objets, les zones concernées dans le code sont le corps des fonctions window_redisplay() et window_reshape().

Enfin, l'initialisation d'OpenGL ainsi que la définition des objets s'effectue dans la fonction main().

Conseils:

Fonctions utiles:

glEnable, glFrontFace, glCullFace, glBegin, glVertex*, glEnd, glMatrixMode, glLoadIdentity, glLoadMatrix*, glMultMatrix*, glRotate*, glTranslate*, glGetFloatv, glClear, glutSwapBuffers