Travaux Pratiques OpenGL
TP7
-
Le but de ce TP est de tracer une cubique d'Hermite. A la fin de ce TP, vous obtiendrez le résultat suivant :
-
Tout d'abord, commencez par ajouter une rotation de la scène (pantin + sphères) autour de l'axe Y de la tête du pantin avec un glRotatef(...). Si on appuie sur la touche 4, la scène tourne vers la gauche et si on appuie sur la touche 6, elle tourne vers la droite. La lumière GL_LIGHT0 doit toujours rester fixe (exemple ci-dessus : pression maintenue sur la touche 6 avec la lampe GL_LIGHT0 allumée).
-
Rappelez les informations suivantes:
-
Comment contrôle-t-on la forme d'une cubique d'Hermite?
-
Donnez la représentation matricielle d'une cubique d'Hermite. Rappelez notament les valeurs de la matrice 4×4 puis créez le type matrice : typedef float Matrix16[16] (dans un fichier matrix16.h) qui servira à manipuler une matrice 4×4.
-
Comment calcule-t-on les coordonnées x1,y1,z1 d'un point P1 de la courbe pour une valeur fixée u1 du paramètre (u1 dans [0,1]).
-
Pour tracer une courbe avec OpenGL, nous allons utiliser un tableau de points ainsi qu'un tableau d'index. Nous allons utiliser un rendu du type GL_LINE_STRIP.
-
Qu'est ce qu'un GL_LINE_STRIP ?
-
Le tableau de points (static float *_pts) contient une liste de points de la courbe sous la forme suivante : x0 y0 z0 x1 y1 z1 x2 y2 z2 ..., chaque coordonnée étant stockée par un flottant.
-
Le tableau d'index (static GLuint *_index) définit l'ordre dans lequel les points du tableau _pts doivent être lus pour le GL_LINE_STRIP. Par exemple un tableau d'index ayant pour valeur : 0 1 2 3 4 5 6 7 8 ... signifie que l'on va tout d'abord envoyer le point numéro 0, puis le point numéro 1, puis le point numéro 2 et ainsi de suite. Le type GLuint représente les entiers non signés dans la librairie GL.
-
Il va donc falloir faire varier le paramètre u entre O et 1 avec un certain pas (par exemple _pas=0.01) et caluler pour chaque valeur, le point de la courbe correspondant pour le stocker dans le tableau de points _pts.
-
Ecrivez la fonction void multVectorMatrix16 (Vector4 v, Matrix16 m, Vector4 res) {...} qui multiplie un vecteur à 4 composantes par une matrice 4×4.
-
Il vous faut aussi créer les types tHermite et pHermite (dans un fichier hermite.h) avec une struture appropriée (vide pour le moment). Vous allez voir quels champs stocker dans votre structure au cours du TP.
-
Soit une matrice de contrôle de la courbe d'Hermite:
Matrix16 controle = {
4. , -3., 2. , 1.,
-4. , 5., -2. , 1.,
20., 0. , -30., 0.,
20., 0. , 30., 0. }
où la première ligne est le premier point de contrôle, la deuxième ligne est le deuxième point de contrôle, la troisième ligne est la tangente au premier point et enfin la quatrième ligne est la tangente au dernier point.
En utilisant la forme matricielle d'une cubique d'Hermite, expliquez comment calculer les 3 coordonnées x,y,z d'un point de la courbe avec uniquement 2 utilisations de la fonction multVectorMatrix16(...). Que ce passe-t-il pour la coordonnée homogène ?
-
Ajoutez un champ permettant de stocker la matrice des coefficients d'hermite ainsi que ceux des points/vecteurs de contrôle dans la structure représentant une cubique d'hermite. Créez ensuite la fonction pHermite creerHermite (Matrix16 controle) qui permet de créer un pointeur sur une cubique d'hermite controlée par les points/vecteurs stockés dans controle.
-
Ecrivez la fonction void hermite (pHermite h, float u, Vector4 pt) {...} qui calcule le point pt de la courbe h correspondant à la valeur u du paramètre.
-
Ecrivez la fonction void courbeHermite (pHermite h, float pas) {...} qui calcule le tableau des points float *pts de la courbe (qui est un champ de la structure sHermite) avec leur tableau d'index GLuint *index (qui est aussi un champ de la structure sHermite) pour un pas d'echantillonnage du paramètre pas.
-
Construisez les tableaux pts et index une bonne fois pour toute (cela ne doit pas être effectué à chaque passe de rendu). Spécifiez l'emplacement de votre programme où vous effectuez cette opération.
ATTENTION : Pensez à allouer l'espace mémoire nécessaire pour les pointeurs pts et index.
-
Créez la fonction afficheHermite (pHermite h) qui trace les points de la courbe en utilisant les tableaux de sommets (Vertex Array). Effectuez ce tracé en tenant compte des directives suivantes:
-
Effectuez le tracé de la courbe avec des tableaux de sommets. Vous aurez besoin de fonctions suivantes : glEnableClientState (GL_VERTEX_ARRAY), glVertexPointer (...), glDrawElements (...), glDisableClientState (GL_VERTEX_ARRAY).
-
Si l'éclairage est activé, désactivez le, le temps de tracer la courbe. Observez ce qu'il se passe si vous ne le faites pas.
-
A l'aide de la fonction glLineWidth(2.), contrôlez l'épaisseur de la courbe lors de son tracé. Attention, cette fonction affecte aussi le tracé des objets en fillaire. Pensez à remettre la valeur à 1. (valeur par défaut) après le tracé de la courbe.
-
Tracez la courbe en blanc.
-
Utilisez la fonctionnalité glBegin(GL_LINES) ... glEnd() pour tracer les 2 tangentes à la courbe (en vert) : celle au point de départ et celle au point d'arrivée. Les tangentes seront affichées/non-affichées en appuyant sur la touche t.
-
Modifiez les tangentes au début et à la fin de la courbe et observez ses différentes formes.
Fin du TP7