Surfaces de Bézier

22 Janvier 1999 - Début
25 Janvier 1999 - Mise à jour

 

Les surfaces de Bézier sont trés utilisée en CAO (Conception Assitée par Ordinateur). Avec la puissance des ordinateurs actuels et à venir, elles sont devenues affichables en temps réel. De plus, elles constituent le support d'une modélisation souple et rapide de surfaces gauches. Ce présent document à pour but de donner la méthode pour réaliser simplement la programmation de ces surfaces.

On commence par étudier les courbes de Bézier qui font parties d'une classe plus générale de courbes tridimensionnelles appellées courbes cubiques.

 

Courbes cubiques

L'équation générale de ces courbes est :

x(t) = ax * t3 + bx * t2 + cx * t + dx
y(t) = ay * t3 + by * t2 + cy * t + dy
z(t) = az * t3 + bz * t2 + cz * t + dz

On peut la donnée sous forme matricielle par Q(t) = [ x(t) y(t) z(t) ] = T * C.
Avec T = [ t3 t2 t 1 ], matrice polynômiale cubique et C = [ [ ax ay az ] [ bx by bz ] [ cx cy cz ] [ dx dy dz ] ], matrice des coéfficients.

On peut exprimer la matrice des coéfficients par la multiplication d'une matrice de base avec une matrice de géométrie : Q(t) = T * B * G.
T = Matrice 1x4 de polynôme
B = Matrice 4x4 de base
G = Matrice 4x3 de géométrie

Par exemple, une courbe cubique nommée courbe d'Hermite possède une matrice de géométrie constituée des 2 points début et fin, et des 2 normales en ces points : G = [ [ p1 ] [ p2 ] [ n1 ] [ n2 ] ].
Et sa matrice de base est :

2 -2 1 1
-3 3 -2 -1
0 0 1 0
1 0 0 0

 

Courbes de bézier

Une courbe de Bézier est entièrement définie par 4 points : p1, p2, p3 et p4 qui définissent l'enveloppe convexe de la courbe. Sa matrice de géométrie est donc définie par ces 4 points : G = [ [ p1 ] [ p2 ] [ p3 ] [ p4 ] ].
Et sa matrice de base est :

-1 3 -3 1
3 -6 3 0
-3 3 0 0
1 0 0 0

Il existe 3 méthodes pour afficher ce type de courbe : l'évaluation brutale, la subdivision récursive et l'avancement par différence. Cette dernière méthode est sans doute la moins gourmande en temps de calcul, mais celle qui requiert le plus de précision durant ces calculs. C'est cette méthode que nous avons choisi car elle est correspond bien aux exigences de calcul d'un ordinateur.

Son principe générale est basé sur le fait que si l'on connait f(t) (une fonction polynomiale quelconque a l'instant t), on peut connaitre f(t + pas) à partir de f(t) car on peut écrire que f(t + pas) = f(t) + deltaf(t). Ce delta restant bien sur a calculer. Le paramètre pas, est le pas d'avancement le long de la courbe. deltaf(t) = f(t + pas) - f(t). Le but est que ce delta soit une valeur fixe le long de la courbe pour réduire au minimum les calculs. En effet, une fois que l'on a f(t + pas), on peut en deduire f(t + 2 * pas) qui est simplement f(t + pas) + deltaf(t). On peut donc avancer tout au long de la courbe en faisant une simple addition de delta.

L'application de l'avancement par différence a une fonction cubique nous donne que f(t) = a * t3 + b * t2 + c * t + d. On veut connaître la différence : deltaf(t) = f(t + pas) - f(t)
deltaf(t) = a * (t + pas)3 + b * (t + pas)2 + c * (t + pas) + d - (a * t3 + b * t2 + c * t + d)
deltaf(t) = 3 * a * pas * t2 + (a * pas2 + 2 * b * pas) * t + a * pas3 + b * pas2 + c * pas
Comme on peut le remarquer, l'équation de delta n'est pas fixe le long de la courbe car elle contient encore des termes t. On lui applique donc l'avancement par différence pour réduire encore d'un degré le polynôme. On fait donc delta2f(t) = deltaf(t + pas) - deltaf(t).
delta2f(t) = 6 * a * pas2 * t + 6 * a * pas3 + 2 * b * pas2
et encore une fois car il reste un terme en t :
delta3f(t) = 6 * a * pas3
On remarque qu'il ne reste plus dans l'équation delta3f de terme en t. Dériver encore une fois cette équation nous donnerai zéro. On a donc fini les différents pas d'avancement, pas du pas d'avancement et pas du pas du pas d'avancement. Que l'on peut mettre sous forme matricielle, en prenant les constantes de chaque formule. E(pas):

0 0 0 1 = f
pas3 pas2 pas 0 = deltaf
6 * pas3 2 * pas2 0 0 = delta2f
6 * pas3 0 0 0 = delta3f

La matrice des différences est donc D = E(pas) * B * G. Il reste maintenant a voir comment se servir de ces équations pour afficher des courbes.

 

Affichage de courbes de Bézier

On effectue la multiplication matricielle de B par G pour avoir la matrice des coéfficients et on fait pour chaque composante x,y et z :

a = - p1 + 3 * p2 - 3 * p3 + p4
b = 3 * p1 - 6 * p2 + 3 * p3
c = - 3 * p1 + 3 * p2
d = p1

Attention, ce résultat n'est valable que pour les courbes de Bézier. Il représente la matrice des coéfficients.
Si l'on désire n points sur la courbe alors on a pas = 1 / (n - 1). De plus les conditions initiales sont :

p = d
delta = a * pas3 + b * pas2 + c * pas
delta2 = 6 * a * pas3 + 2 * b * pas2
delta3 = 6 * a * pas3

Et l'algorithme est :

Faire n fois

Nouveau point de la courbe = p
p += delta
delta += delta2
delta2 += delta3

 

Continuité des courbes de Bézier

Soit 2 courbes de Bézier définies par respectivement par les points : p1, p2, p3 et p4 pour la première et p5, p6, p7 et p8 pour la seconde. Il y a continuité de premier niveau entre les 2 courbes si p4 = p5. Il ya continuité de second niveau (c'est-à-dire sur la dérivée de la courbe) si p3, p4 = p5 et p6 sont alignés.

 

Affichage des surfaces de Bézier

Les surfaces de Bézier appartiennent à la classe des surfaces bicubiques. Les surfaces bicubiques sont une généralisation des courbes paramétriques cubiques. L'équation de ces surfaces est : Q(s,t) = S * B * G * BT * TT avec S = [ s3 s2 s 1 ] et T = [ t3 t2 t 1 ].
Dans le cas d'une surface de Bézier, G la matrice de géométrie contient les 16 points de contrôle de la surface, la matrice B est la même que celle utilisée pour les courbes.

L'avancement par différence est le même que précédement adapté sur une surface. Il vaut mieux dans ce cas écrire les équations sous forme matricielle. On applique pour chaque composante x,y,z les équations suivantes :

Pour avoir la matrice des coéfficients on fait C = B * G * BT. C'est une matrice 4x4.
Si l'on désire n points sur la surface en longueur et p en largeur, on a spas = 1 / (n -1) et tpas = 1 / (p - 1).
La matrice des différences est DD = E(spas) * C * E(tpas). C'est une matrice 4x4.

L'algorithme est :

Faire n fois

TMP = 1ère ligne de DD

Faire p fois

Nouveau point de la surface = 1ère col. de TMP
1ère col. de TMP += 2ème col. de TMP
2ème col. de TMP += 3ème col. de TMP
3ème col. de TMP += 4ème col. de TMP

1ère ligne de DD += 2ème ligne de DD
2ème ligne de DD += 3ème ligne de DD
3ème ligne de DD += 4ème ligne de DD

col. = colonne.

Continuité des surfaces de Bézier

Aprés avoir vu l'affichage des surfaces de Bézier, on peut faire des remarques sur la continuité de ces surfaces. Soit 2 surfaces définies par les points de contrôle de p11 à p44 et q11 à q44. Comme pour les courbes, pour qu'il y ait continuité de premier niveau, il faut que les points de contours soient égaux par exemple pi4 = qi1. Pour qu'il y ait continuité de second niveau il faut que les points de part et s'autre du coté commun soient alignés trois à trois. Dans le cas précédent par exemple, il faut pour assurer la continuité que pi3, pi4 = qi1et qi2 soient alignés.

 

Normale à une surface de Bézier

La normale à une surface de Bézier, est la multiplication vectorielle de la dérivée de la surface sur sa longueur par la dérivée de la surface sur sa largeur. La dérivée sur la longueur est NS = d Q(s,t) / ds = d ( S * B * G * BT * TT ) / ds = d S / ds * B * G * BT * TT. De même, la dérivée sur la largeur est NT = d Q(s,t) / dt = S * B * G * BT * (d T / dt)T. Sachant que d S / ds = [ (3*s2) (2*s) 1 0 ] dérivée de S. On peut appliquer l'algorithme d'avancement par différence :
f(s) = 3 * a * s2 + 2 * b * s + c
deltaf(s) = f(s + pas) - f(s) = 6 * pas * a * s + 3 * pas2 * a + 2 * pas * b
delta2f(s) = 6 * pas2 * a
La matrice d'avancement par différence pour cette dérivée est donc ED(pas) :

0 0 1 0 = f
3 * pas2 2 * pas 0 0 = deltaf
6 * pas2 0 0 0 = delta2f
0 0 0 0 = delta3f

On modifie l'algorithme précédent pour intégrer le calcul des normales est donc :

C = B * G * BT.
spas = 1 / (n -1) et tpas = 1 / (p - 1). n nombre de points en largeur et p nombre de points en longueur.
DD = E(spas) * C * E(tpas).
DNS = ED(spas) * C * E(tpas).
DNT = E(spas) * C * ED(tpas).

Faire n fois

TMPD = 1ère ligne de DD
TMPNS = 1ère ligne de DNS
TMPNT = 1ère ligne de DNT

Faire p fois

Nouveau point de la surface = 1ère col. de TMPD
Normale à la surface = Produit vectoriel(1ère col. TMPNS,1ère col. TMPNT)
1ère col. de TMPD += 2ème col. de TMPD
2ème col. de TMPD += 3ème col. de TMPD
3ème col. de TMPD += 4ème col. de TMPD
1ère col. de TMPNS += 2ème col. de TMPNS
2ème col. de TMPNS += 3ème col; de TMPNS
3ème col. de TMPNS += 4ème col. de TMPNS
1ère col. de TMPNT += 2ème col. de TMPNT
2ème col. de TMPNT += 3ème col. de TMPNT
3ème col. de TMPNT += 4ème col. de TMPNT

1ère ligne de DD += 2ème ligne de DD
2ème ligne de DD += 3ème ligne de DD
3ème ligne de DD += 4ème ligne de DD
1ère ligne de DNS += 2ème ligne de DNS
2ème ligne de DNS += 3ème ligne de DNS
1ère ligne de DNT += 2ème ligne de DNT
2ème ligne de DNT += 3ème ligne de DNT