require("../global.php"); entete(); ?>
Prenons l'exemple de la rotation autour de l'axe x'Ox, on a vu que le point R obtenu après rotation d'un angle a du point P était obtenu par:
Rx = Px Ry = Py*cos(a) - Pz*sin(a) Rz = Py*sin(a) + Pz*cos(a)
Si on écrit ça sous la forme du produit du vecteur P par une matrice, on arrive à :
| | | | | | | Rx | | 1 0 0 | | Px | | Ry | = | 0 cos(a) -sin(a) | * | Py | | Rz | | 0 sin(a) cos(a) | | Pz | | | | | | | | | | 1 0 0 | où encore pour alléger l'écriture R = | 0 cos(a) -sin(a) | * P | 0 sin(a) cos(a) | | |
Tiens et si on rotait maintenant R d'un angle b autour de l'axe y'Oy ? Bein ça serait le même genre :
Sx = Rx*cos(b) + Rz*sin(b) Sy = Ry Sz = -Rx*sin(b) + Rz*cos(b)
D'où sous la forme d'un produit d'un vecteur par une matrice :
| | | | | | | Sx | | cos(b) 0 sin(b) | | Rx | | Sy | = | 0 1 0 | * | Ry | | Sz | | -sin(b) 0 cos(b) | | Rz | | | | | | | | | | cos(b) 0 sin(b) | où encore pour alléger l'écriture S = | 0 1 0 | * R | -sin(b) 0 cos(b) | | |
Mais R on l'a obtenu juste avant, on le remplace par sa valeur :
| | | | | cos(b) 0 sin(b) | | 1 0 0 | S = | 0 1 0 | * | 0 cos(a) -sin(a) | * P | -sin(b) 0 cos(b) | | 0 sin(a) cos(a) | | | | |
Et comme maintenant on sait faire le produit de 2 matrices, ne nous génons pas :
| | | cos(b) sin(b)*sin(a) sin(b)*cos(a) | S = | 0 cos(a) -sin(a) | * P | -sin(b) sin(a)*cos(b) cos(a)*cos(b) | | |
On continue avec la dernière rotation, celle autour de l'axe z'Oz ?
Tx = Sx*cos(c) - Sy*sin(c) Ty = Sx*sin(c) + Sy*cos(c) Tz = Sz
D'où sous la forme d'un produit d'un vecteur par une matrice :
| | | | | | | Tx | | cos(c) -sin(c) 0 | | Sx | | Ty | = | sin(c) cos(c) 0 | * | Sy | | Tz | | 0 0 1 | | Sz | | | | | | | | | | cos(c) -sin(c) 0 | où encore pour alléger l'écriture T = | sin(c) cos(c) 0 | * S | 0 0 1 | | |
Mais S on l'a obtenu juste avant à partir du point de départ P, on le remplace par sa valeur pour obtenir le point roté successivement sur les 3 axes :
| | | | | cos(c) -sin(c) 0 | | cos(b) sin(b)*sin(a) sin(b)*cos(a) | T = | sin(c) cos(c) 0 |*| 0 cos(a) -sin(a) |*P | 0 0 1 | | -sin(b) sin(a)*cos(b) cos(a)*cos(b) | | | | |
Il ne nous reste plus qu'à faire ce produit de matrices :
| | | Cc*Cb Cc*Sb*Sa-Sc*Ca Cc*Sb*Ca+Sc*Sa | T = | Sc*Cb Sc*Sb*Sa+Cc*Ca Sc*Sb*Ca-Cc*Sa | * P | -Sb Sa*Cb Ca*Cb | | | |
(pour que cette formule rentre dans les 80 colonnes de la page, j'ai simplifié l'écriture : sin(a) = Sa , cos(a) = Ca, sin(b) = Sb etc.. )
Pour finir complètement notre rotation, il reste le problème des deux translations pour tenir compte du "centre" de rotation. Ce qu'il fallait faire :
Or on a vu qu'un translation s'interprète comme l'ajout d'un vecteur translation. Allons-y :
De tout ce que nous venons de dire, on peut en déduire la conclusion :
La rotation de chaque point P d'un objet peut être réalisée
par l'opération suivante :
[R]*P + D où [R] est la matrice 3x3 définie par : R(1,1) = cos(c)*cos(b) R(2,1) = sin(c)*cos(b) R(3,1) = -sin(b) R(1,2) = cos(c)*sin(b)*sin(a) - sin(c)*cos(a) R(2,2) = sin(c)*sin(b)*sin(a) + cos(a)*cos(c) R(3,2) = sin(a)*cos(b) R(1,3) = cos(c)*sin(b)*cos(a) + sin(c)*sin(a) R(2,3) = sin(c)*sin(b)*cos(a) - cos(c)*sin(a) R(3,3) = cos(a)*cos(b) et D un vecteur de dimension 3 défini par : C - [R]*C C étant le "centre" de rotation a l'angle de rotation autour de l'axe x'Ox b l'angle de rotation autour de l'axe y'Oy c l'angle de rotation autour de l'axe z'oz |
Comme on vient d'introduire une nouvelle méthode, il est naturel de se demander ce que ça gagne par rapport à la façon de faire précédente.
PiedDePage(); ?>