Master Informatique 2017-2018
M3DS



TP 06 : Courbes


Exercice 1. Introduction

L’objectif est de :


Exercice 2. Courbe de Hermite

Question 1. Complétez Hermite::eval(t) pour évaluer la courbe de hermite P(t) : les points extrémités sont les attributs _a et _b, et les tangentes en ces points sont _ta et _tb. Il s’agit donc de donner les bonnes valeurs aux 16 coefficients de la matrice (initialisée à la matrice identité dans le squelette) puis calculer

P(t)=(t3 t2 t 1)M



_a 
_b 
_ta 
_tb 




(sur les Vector3, vous pouvez utiliser les opérateurs usuels : p3=p1+p2, p2=0.3*p1, etc) .

Vous ne pouvez pas encore visualiser le résultat car il faut répondre à la question qui suit pour afficher la courbe.

Question 2. Complétez Hermite::draw() : il suffit de donner un nombre suffisant de points pour tracer la courbe.

Testez et manipulez les points initiaux et les tangentes (click gauche+move sur l’extrémité des flêches) pour bien percevoir la conséquence sur le tracé.


Exercice 3. Courbe de Bezier
Pour faire cet exercice il faut cliquer sur le bouton "Bezier". Vous pouvez maintenant saisir (toujours avec click droit pour insérer, et click gauche pour bouger les points déjà saisis) des points représentant un polygone de contrôle.

On travaille à présent dans Curve.cpp.

Question 1. On se préoccupe de Curve::evalBezier(float t) : cette méthode doit donner le point P(t) de la courbe de Bézier par l’algorithme de De Casteljau (la méthode de tracé qui appelle cette méthode est déjà effectuée par le squelette).

Les points de contrôle saisis à la souris sont déjà recopiés dans le tableau castel (cf code; c’est un tableau de Vector3) : castel[i] vous donne donc le point de contrôle P(i). Il vous suffit alors d’appliquer l’algorithme triangulaire de De Casteljau vu en cours, en faisant évoluer le tableau castel (on rappelle la relation Pij=(1−t)Pij−1+tPi+1j−1).

Visualisez et testez (déplacez alors les points de contrôle saisis avec click gauche). Familiarisez vous avec la forme des Béziers (constatez le contrôle global, les tangentes aux extrémités, etc; constatez aussi la complexité lorsqu’on a de nombreux points de contrôles).


Exercice 4. Courbe d’interpolation
On travaille à présent dans CatmullRomCurve.cpp. A présent, 2 points successifs saisis seront reliés par une courbe de Bézier cubique.

Lorsque vous cliquer sur "Bezier Interpolation" vous pouvez saisir, toujours avec click droit, les points à relier (des points intermédiaires, en bleu, sont ajoutés automatiquement : ils serviront à définir la Bézier cubique par 4 points de contrôle). Vous pouvez contrôler la position de chaque point avec click gauche+move.

Dans la classe CatmullRomCurve vous accédez aux points saisis (les rouges) par point(i) et vous obtenez les points intermédiaires (les bleus) par intermediate(i,0) et intermediate(i,1) (les deux points intermédiaires entre point(i) et point(i+1)) : ils sont tous de type Vector3).

Question 1. Vous devez compléter CatmullRomCurve::draw() : l’approche suggérée est de tracer une courbe de Bézier pour chaque couple (p(i),p(i+1)) (i.e. tracer n−1 courbes de Bézier pour n points saisis). Il suffit donc d’utiliser le tracé effectué à la question précédente, mais en initialisant correctement chaque courbe (avec les point(i) et intermediate(i,j)).

Testez : n’oubliez pas de faire bouger les points intermédiaires bleus pour constater leur influence sur la forme de la courbe.

Question 2. On désire offrir un placement automatique des points intermédiaires. Appliquez la méthode de Catmull-Rom (affectation des points intermédiaires pour avoir une tangente parallèle à (point(i+1)−point(i−1)) dans la méthode CatmullRomCurve::setup() : vous devez y affecter tous les points intermédiaires; l’affectation se fait avec les setters this->intermediate(i,0,un_Vector3) et this->intermediate(i,1,un_Vector3). Pour tester il suffit de cliquer sur "Catmull-Rom" (cela appelle la méthode CatmullRom::setup(); les points bleus doivent donc être correctement affectés suite au click sur ce bouton).


Exercice 5. Repère TBN
L’objectif est de tracer le repère TBN le long de la courbe.

Question 1. Il faut calculer la dérivée (le vecteur vitesse) et la dérivée seconde (vecteur accélération) d’une courbe de bézier. Pour simplifier, on suppose que la courbe de bézier est cubique (ce qui correspond à la courbe d’interpolation de l’exercice précédent). Il faut compléter Curve::evalCubicVelocity et Curve::evalCubicAcceleration (notez que Curve::evalCubicBezier pour le calcul des points est déjà faite juste au dessus : vous pouvez vous en inspirer).

Ensuite, on détermine le repère T,B,N grâce à ces vecteurs vitesse et accelération : le calcul est déjà effectué dans CatmullRomCurve::tbn(double tValue). Constatez qu’il s’agit du calcul indiqué dans le cours. Le résultat est stocké dans une matrice 4x4. Que représente d’ailleurs cette matrice en terme de changements de repère ?

Testez : saisissez une courbe d’interpolation puis cliquez sur le bouton "switch TBN" pour afficher le repère TBN calculé. Constatez le "flip" de N (changement discontinu brutal du sens du vecteur N). Comprenez d’où il provient.


Ce document a été traduit de LATEX par HEVEA