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(); ?>