M1 I3D: CAO

 1/ Courbe de Bézier

Courbe de Bézier par l'algorithme de Casteljau

Nous désirons tracer une courbe de Bézier cubique par l'algorithme de Casteljau. Vous disposez pour démarrer des fichiers suivants :

makefile, main.c

La bibliothèque graphique utilisée est opengl. Son étude n'étant pas l'objet de ce TP, son utilisation est masquée et simplifiée par quelques fonctions simples que vous utiliserez en priorité : chooseColor, drawPoint et drawLine. Vous capturerez les evenements de la souris (clics) dans la fonction mouse, les évenements clavier (touche enfoncée) dans la fonction keyboard et dessinerez dans la fonction display.

Tracé du polygone de contrôle

Votre premiere tache consiste à pouvoir saisir et visualiser un polygone de controle en cliquant successivement dans la fenetre pour désigner ses points. Prévoyez deux modes d'affichage (couleur blanche) : un mode où le polygone de controle apparait comme une ligne brisée, un mode ou on ne voit que les points. On basculera d'un mode a l'autre en appuyant sur la touche C du clavier.

Interpolations successives

Pour tracer la courbe de Bézier, vous devez écrire une fonction :

Point Bezier(float t)

renvoyant pour toute coordonnée t entre 0 et 1 le point correspondant (structure contenant x et y).
Ce point final est obtenu en pratiquant des interpolations successives (pour la valeur t) sur les n points du polygone de contrôle de départ jusqu'à ce qu'il n'en reste plus qu'un.

Tracé de la courbe

Dessinez la courbe de Bézier en faisant varier le paramètre t entre 0 et 1. Elle sera affichée comme une ligne brisée verte. Que remarquez vous si le nombre de points de contrôle augmente ? Essayez d'ajuster dynamiquement l'échantillonnage de la courbe de Bézier.

Interactions

En utilisant les fonctions mouse (pour détecter les clics souris) et mousemove (pour détecter les déplacements de la souris) ajoutez à votre programme la possibilité de saisir un sommet du polygone de controle et le déplacer en effectuant une opération de type "drag and drop". La courbe de Bézier doit se redessiner en conséquence.

Tracé des lignes de construction

Associez une touche à un mode d'affichage supplémentaire. Nous souhaitons maintenant visualiser les lignes de construction reliant les différents points du diagramme d'interpolations successives. Modifiez votre programme pour voir ces lignes pour une valeur fixe du paramètre t. Permettre ensuite d'incrémenter ou décrémenter cette valeur de t avec deux touches et observer les lignes de construction se redessiner.

 2/ Carreau de Bézier

Carreau de Bézier par l'algorithme de Casteljau

Récupérez le fichier de démarrage suivant : 3Dmain.c.
Définissez une variable "carreau" comme étant 4 points. Vous l'initialiserez aux valeurs suivantes : A(4,1,1), B(4,4,3), C(1,3,1), D(1,1,3). Dessinez le contour du carreau en lignes blanches puis préparer les modes d'affichage suivants.

Tracé de la surface sous forme de nuage de points

Ecrire une fonction Point bezier3D(float s, float t) qui calcule en deux interpolations successives, sur s puis sur t, le point final sur la surface de Bézier correspondant à ce couple de valeurs (s,t) (chacune entre 0 et 1). Faites varier s et t dans la fonction display pour tracer un nuage de points suffisamment dense pour voir la surface. Choisir une couleur différente du contour.

Interactions

Donner la possibilité de bouger un point de contrôle en translation, d'un petit incrément, lorsqu'on appuie sur les touches AZEQSD. Associez ces touches aux grands axes x,y et y, en + et en -. Permettre également de passer au point de contrôle suivant, de manière cyclique, en appuyant sur F. Observez la surface se déformer interactivement.

Tracé de la surface sous forme de petits quadrilatères

Dans un autre mode de dessin (vous associerez une touche à chaque mode) vous dessinerez la surface sous forme d'un maillage dense de petits quadrilatères en utilisant la fonction drawQuad fournie.

Tracé des droites d'interpolation sur s et sur t

Pour mieux visualiser le processus d'interpolation, créez un mode additionnel qui pourra se combiner avec l'un ou l'autre des modes précédents d'affichage. Dans ce mode vous dessinerez dans une couleur visible la droite reliant les deux premiers points issus de l'interpolation sur s des 4 points initiaux. Vous dessinerez également le point final sur la surface obtenu après l'interpolation sur t. Pour bien voir ce point faites appel à glPointSize pour grossir le dessin du point. Cet affichage dépendra donc d'une valeur pour un s et pour un t.
Donnez la possibilité de faire évoluer interactivement par incrément et décrément la valeur de s et t choisi pour le dessin, et testez le résultat.

 3/ Carreaux de Bézier

Tracé de la grille de contrôle

Récuperez le fichier de démarrage : 3Dmain.c. Dessinez les points de controle suivants et reliez les pour voir la grille de contrôle (formée de plusieurs "carrés") :

P(0,0)=(0,0,0); P(0,1) = (0,1,0); P(0,2) = (0,2,0); P(0,3) = (0,3,0);
P(1,0)=(1,0,0); P(1,1) = (1,1,2); P(1,2) = (1,2,1); P(1,3) = (1,3,1);
P(2,0)=(2,0,0); P(2,1) = (2,1,2); P(2,2) = (2,2,1); P(2,3) = (2,3,1);
P(3,0)=(3,0,0); P(3,1) = (3,1,0); P(3,2) = (3,2,0); P(3,3) = (3,3,0);

Interpolations successives

Vous écrirez le contenu de la fonction :

Point Bezier(float s, float t)

qui à un point de coordonnées s et t du carreau associe sa position dans l'espace 3D.

La grille de 4x4 points de contrôle est interpolée successivement pour le choix de paramètres s et t, pour donner une grille de 3x3 points puis 2x2, puis 1x1 = le point final.

Tracé de la surface sous forme de nuage de points

Dessinez grâce a la fonction drawPoint fournie la surface correspondant à nos points de contrôle.

Tracé de la surface sous forme d'un maillage de petits quadrilatères

Dessinez grâce a la fonction drawQuad fournie la surface correspondant à nos points de contrôle.

Interactions

Associez aux touches AZEQSD le mouvement en translation sur xyz d'un point de contrôle choisi par les touches F et G. Observez les mouvements de la surface lorsque vous bougez les points de contrôle.

Tracé des grilles d'interpolation

Pour mieux visualiser le processus d'interpolation, créez un mode additionnel qui pourra se combiner avec l'un ou l'autre des modes précédents d'affichage. Dans ce mode vous dessinerez dans une couleur visible, pour un choix fixe de s et t les grilles intermédiaires obtenues par interpolations successives (grille 3x3, grille 2x2 et point final). Donnez la possibilité de faire évoluer interactivement par incrément et décrément la valeur de s et t choisi pour ce dessin, et observez le résultat.

Grille de taille différente dans les deux dimensions

Comment modifier le programme pour permettre de travailler avec une grille de taille quelconque NxM points ?