Le but de ce TP est d'observer le repère de Frénet le long d'une courbe. A la fin de ce TP, vous aurez animé un repère de Frénet le long d'une cubique d'Hermite comme ci-dessous.
Qu'est ce qu'un repère de Frénet ? Illustrez votre réponse par un schéma.
Comment calcule-t-on le repère de Frénet en un point d'une courbe paramétrique dont on connait l'équation ? Combien de fois est-il nécessaire de dériver l'équation de la courbe ? Pourquoi ?
Rappelez la forme matricielle de la dérivée première (notament les valeurs de la matrice 4×4) d'une cubique d'Hermite ainsi que la forme matricielle de la dérivée seconde.
Sur le modèle de la fonction void hermite (Matrix controle, float u, Vector pt) écrivez les fonctions :
void hermiteDu (Matrix controle, float u, Vector v) {...} qui retourne dans le vecteur v la dérivée première à la cubique d'Hermite en u,
void hermiteDuu (Matrix controle, float u, Vector a) {...} qui retourne dans le vecteur a la dérivée seconde à la cubique d'Hermite en u.
Recopier dans votre programme la fonction suivante :
Cette fonction trace un repère de taille longueur, centré sur le repère objet avec une flêche rouge le long de l'axe des x, une flêche verte le long de l'axe des y et une flêche bleue le long de l'axe des z.
Le but est maintenant de positionner le repère objet sur le repère de Frénet et de visualiser le repère avec la fonction traceRepere().
Rappelez la forme d'une matrice de changement de repère en coordonnées homogènes.
Si l'on connait les coordonnées des composantes (centre et vecteurs) du repère de Frénet, comment est la matrice qui permet d'amener le repère objet sur le repère de Frénet ?
La fonction glMultMatrixf(_transf) permet de multiplier la tête de la pile de matrices courante (MODELVIEW dans notre cas) par la matrice _transf. La matrice _transf doit être définie par colonnes :
Ecrivez la fonction void Frenet (Vector pt, Vector t, Vector a, Matrix transf) {...} qui calcule la matrice de transformation amenant le repère objet sur le repère de Frénet défini en un point pt avec la tangente t et l'accélération a.
A l'aide de la fonction Frenet (), écrivez la fonction void hermiteFrenet (Matrix controle, float u, Matrix transf) {...} qui calcule la matrice de transformation amenant le repère objet sur le repère de Frénet d'une cubique d'Hermite contrôlée par controle pour une valeur u du paramètre.
Avec les fonctions glPushMatrix(), glPopMatrix(), glMultMatrixf(), hermiteFrenet() et traceRepere(), affichez le repère de Frénet au point central (u=0.5) de votre cubique d'Hermite.
Faites maintenant évoluer la valeur du paramètre u entre 0 et 1 dans la fonction noEvent() pour obtenir l'animation présentée en haut de la page. L'animation est activée/désactivée en appuyant sur la touche u.
Modifiez maintenant les paramétres de contrôle de votre cubique d'Hermite pour qu'elle ait un point d'inflexion. Observez le comportement du repère de Frénet autour de ce point. Que ce passe-t-il ? Pourquoi ?
Avant le point d'inflexion
Après le point d'inflexion
Pour détecter le "flip" du repère, on calcule le produit scalaire des vecteurs normale principale entre deux positions successives du repère de Frénet. Si le produit scalaire des deux vecteurs est inférieur à zéro, il y a eu un flip. Expliquez pourquoi.
Ecrivez la fonction float dotProduct (Vector v1, Vector v2) {...] qui retourne le produit scalaire des vecteurs v1 et v2 puis modifiez votre programme pour qu'il n'y ait plus de flip : si il y a un flip les vecteurs normale principale et binormal sont multiplié par -1. Vous obtiendrez alors le résultat suivant autour du point d'inflexion :
Avant le point d'inflexion
Après le point d'inflexion
L'animation ne change pas s'il n'y a pas de point d'inflexion et elle devient comme suit s'il y en a un :