Intro :
Voici les matrices de rotation des axes X, Y et Z :
Nous savons comment faire une rotation autour des axes X, Y, et Z, mais comment faire une rotation à partir d’un axe quelconque différent des précédents ?
Prérequis :
– Savoir ce qu’est une matrice
– Savoir ce qu’est une transformation de repère
– Savoir utiliser les objets et fonctions mathématiques de la librairie D3DX
Explications :
Nous allons présenter deux méthodes : la formule de Rodrigues en deux variantes et une fonction correspondante de la librairie D3DX.
La formule de Rodrigues suivante permet de calculer la position d’un point subissant une rotation autour d’un axe quelconque.
Les variables sont : la position d’un point qui subit la rotation ;
un angle de rotation ;
vecteur d’unité 1 qui joue le rôle d’axis de rotation.
Voici l’implémentation de cette formule en C++ :
D3DXVECTOR3 MatrixRotationAxis(D3DXVECTOR3& axis, D3DXVECTOR3& v, float fAngle)
{
D3DXVec3Normalize(&axis, &axis);
D3DXVECTOR3 vect1 = v * cos(fAngle);
D3DXVECTOR3 vect2;
D3DXVec3Cross(&vect2, &axis, &v);
vect2 *= sin(fAngle);
float fDotProduct = D3DXVec3Dot(&axis, &v);
D3DXVECTOR3 vect3 = axis * fDotProduct * (1 - cos(fAngle));
return vect1 + vect2 + vect3;
}
Une autre formule de Rodrigues permet de calculer rapidement la matrice de révolution autour d’un axe et d’un angle quelconques.
Les variables sont : la matrice de rotation autour d’un axe
d’unité 1 et d’angle
;
étant la matrice identité ;
et la matrice
Voici l’implémentation de cette formule en C++ :
D3DXMATRIX D3D10Renderer::MatrixRotationAxis(D3DXVECTOR3& axis, float fAngle)
{
// Il faut convertir le vecteur d'axis en unité 1 sinon cela
// ne fonctionne pas
D3DXVec3Normalize(&axis, &axis);
D3DXMATRIX K;
D3DXMatrixIdentity(&K);
K._11 = 0;
K._12 = -axis.z;
K._13 = axis.y;
K._21 = axis.z;
K._22 = 0.0f;
K._23 = -axis.x;
K._31 = -axis.y;
K._32 = axis.x;
K._33 = 0;
// Pour éviter que ce champ soit multiplié
// par les scalaires, on le met à 0
K._44 = 0;
D3DXMATRIX identity;
D3DXMatrixIdentity(&identity);
D3DXMATRIX squared;
D3DXMatrixMultiply(&squared, &K, &K);
D3DXMATRIX rot = identity + K * sin(fAngle) + squared * (1 - cos(fAngle));
return rot;
}
D’autre part, on peut aussi se servir de la fonction D3DXMatrixRotationAxis équivalente à la précédente formule de Rodrigues :
#include <d3dx10math.h> D3DXMATRIX worldMatrix; D3DXMatrixIdentity(&worldMatrix); static float r = 0.0f; r += fTimeSinceLastFrame; D3DXVECTOR3 axis(1.0f, -1.0f, 0.0f); D3DXMatrixRotationAxis(&worldMatrix, &axis, r);
Résumé :
Nous avons appris deux méthodes qui permet de faire la rotation d’un point.
Références :
– https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula

