Tutoriel 07 - Transformations

Rotation

Ogldev

Traducteur

Sylvain DOREMUS

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.

Commentez

- Titre : Tutoriel 07 - Transformations

- Auteur : Ogldev

- Traducteur : Sylvain DOREMUS

- Parution : 19 juin 2014

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2014 Etay Meiri. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Navigation

- II. Premier chapitre

- III. Explication du code

- IV. Sources

- V. Remerciements

- Navigation

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.0f;
World.m[0][3]=0.0f;
World.m[1][0]=sinf(Scale);
World.m[1][1]=cosf(Scale);
World.m[1][2]=0.0f;
World.m[1][3]=0.0f;
World.m[2][0]=0.0f;
World.m[2][1]=0.0f;
World.m[2][2]=1.0f;
World.m[2][3]=0.0f;
World.m[3][0]=0.0f;
World.m[3][1]=0.0f;
World.m[3][2]=0.0f;
World.m[3][3]=1.0f;

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.

Résultat

IV - Sources

Vous pouvez télécharger les sources de ce projet en suivant ce lien :

Récupérer les sources

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