Navigation▲
Tutoriel précédent : les translations | Sommaire | Tutoriel suivant : les mises à l'échelle |
II. Premier chapitre▲
La prochaine transformation dans notre liste est la rotation, c'est-à-dire que pour un angle et un point donnés, nous voulons tourner le point autour d'un axe. Nous changerons toujours deux des trois coordonnées et laisserons la troisième inchangée. Cela signifie que la transformation se fera sur un des trois plans majeurs : XY (quand on tourne autour de l'axe Z), YZ (quand on tourne autour de l'axe X), XZ (quand on tourne autour de l'axe Y).
Il y a des transformations de rotation plus complexes qui permettent la rotation autour d'un vecteur arbitraire mais nous n'en avons pas encore besoin à cette étape.
Définissons le problème en termes généraux.
Considérons le diagramme suivant :
Nous voulons nous déplacer sur le cercle du point (x1, y1) au point (x2, y2). Autrement dit, nous voulons tourner le point (x1, y1) selon l'angle α2.
Supposons que le rayon de ce cercle soit 1, ça signifie donc ceci :
x1=
cos(&
#945
;1
)
y1=
sin(&
#945
;1
)
x2=
cos(&
#945
;1
+&
#945
;2
)
y2=
sin(&
#945
;1
+&
#945
;2
)
Nous allons utiliser les relations trigonométriques suivantes pour développer x2 et y2 :
cos(&
#945
;+
b) =
cos&
#945
;.cos&
#946
; -
sin&
#945
;.sin&
#946
;
sin(&
#945
;+
b) =
sin&
#945
;.cos&
#946
; +
cos&
#945
;.sin&
#946
;
Nous pouvons alors écrire :
x2=
cos(&
#945
;1
+&
#945
;2
) =
cos&
#945
;1
.cos&
#945
;2
-
sin&
#945
;1
.sin&
#945
;2
=
x1.cos&
#945
;2
-
y1.sin&
#945
;2
y2=
sin(&
#945
;1
+&
#945
;2
) =
sin&
#945
;1
.cos&
#945
;2
+
cos&
#945
;1
.sin&
#945
;2
=
y1.cos&
#945
;2
+
x1.sin&
#945
;2
Dans le diagramme ci-dessus, nous regardons le plan XY et Z pointe dans la page. Si X et Y font partie d'un vecteur 4D alors l'équation ci-dessus peut être écrite sous forme matricielle (sans affecter Z ni W) :
Si nous voulons créer des rotations autour des axes X et Y alors les équations sont globalement les mêmes, mais la matrice est organisée de façon un peu différente. Voici la matrice de rotation autour de l'axe Y :
Et la matrice de rotation autour de l'axe X :
III. Explication du code▲
Les changements de code dans ce tutoriel sont mineurs. Nous changeons uniquement le contenu de la matrice de transformation dans le code C/C++.
World.m[0
][0
]=
cosf(Scale);
World.m[0
][1
]=-
sinf(Scale);
World.m[0
][2
]=
0.0
f;
World.m[0
][3
]=
0.0
f;
World.m[1
][0
]=
sinf(Scale);
World.m[1
][1
]=
cosf(Scale);
World.m[1
][2
]=
0.0
f;
World.m[1
][3
]=
0.0
f;
World.m[2
][0
]=
0.0
f;
World.m[2
][1
]=
0.0
f;
World.m[2
][2
]=
1.0
f;
World.m[2
][3
]=
0.0
f;
World.m[3
][0
]=
0.0
f;
World.m[3
][1
]=
0.0
f;
World.m[3
][2
]=
0.0
f;
World.m[3
][3
]=
1.0
f;
Comme vous pouvez le voir, nous tournons autour de l'axe Z. Vous pouvez essayer les autres rotations, mais je pense qu'à ce stade, sans une vraie projection de la 3D vers la 2D, les autres rotations vont sembler étranges.
Nous les réaliserons dans une classe de pipeline complet de transformation dans les tutoriels à venir.
IV. Sources▲
Vous pouvez télécharger les sources de ce projet en suivant ce lien :
V. Remerciements▲
Merci à Etay Meiri de nous permettre de traduire son tutoriel.
Merci à LittleWhite pour ses corrections et à ced pour sa relecture.
Navigation▲
Tutoriel précédent : les translations | Sommaire | Tutoriel suivant : les mises à l'échelle |