MAIS QUEL RAPPORT AVEC LES ROTATIONS ?

 

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 :

  1. Translater pour ramener le "centre" C à l'origine du repère
  2. Faire les 3 rotations autour des 3 axes (ce que nous venons de faire)
  3. Translater pour remettre le "centre" à sa place

Or on a vu qu'un translation s'interprète comme l'ajout d'un vecteur translation. Allons-y :

  1. Translation pour "ramener" le centre C en O : P devient P + (O-C) et comme les coordonnées de l'origine du repère sont (0,0,0) cela revient à P - C.
  2. Effectuer la rotation : (P-C) est multiplié par la matrice 3x3 de rotation que nous venons de voir. Pour simplifier l'écriture je l'appelle [R]. Par conséquent, (P-C) devient [R]*(P-C).
  3. Translation en sens inverse : [R]*(P-C) devient [R]*(P-C) + (C-O) = [R]*(P-C) + C Et cela donne finalement : [R]*P + (C - [R]*C) C - [R]*C est un vecteur qui ne dépend que du "centre" et donc pas des points à roter.

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.