Comment calculer une matrice de rotation 3x3 à partir de vecteurs 2 directions?


10

J'ai 2 vecteurs de direction, pour l'axe X et l'axe Y de l'objet. Comment calculer la matrice de rotation de l'objet à l'aide de ces éléments?

Réponses:


17

L'idée de base est d'utiliser un produit croisé pour générer les axes orthogonaux supplémentaires de votre matrice de rotation, en fonction des axes que vous avez déjà.

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

Notez que ce qui précède ne fait pas d'hypothèses sur les vecteurs X et Y (à part qu'ils ne sont pas identiques), et fait beaucoup de calculs supplémentaires que cela pourrait ne pas avoir à faire dans votre situation.

Par exemple, dans ce code, je fais un deuxième produit croisé pour être sûr que notre matrice obtient un axe Y orthogonal, au lieu de croire aveuglément que les axes X et Y d'entrée sont précisément à 90 degrés l'un de l'autre. Si, dans votre situation, vous êtes sûr que vos axes d'entrée sont vraiment orthogonaux les uns aux autres, vous pouvez ignorer le deuxième produit croisé et simplement affecter directement le vecteur Y d'entrée, au lieu de le recalculer.

Notez que je suppose que votre représentation matricielle a des membres vectoriels «X, Y, Z» accessibles. Certaines implémentations exposent simplement un tableau de neuf flottants à la place, auquel cas le vecteur «X» sera soit les éléments 0, 1 et 2, soit 0, 3 et 6, selon que la matrice est de type ligne principale ou colonne - Majeur. Dans cette situation (ennuyeuse), je trouve généralement qu'il est plus facile de simplement essayer les deux façons et de voir laquelle fonctionne, plutôt que de parcourir la documentation pour essayer de déterminer quel ordre votre implémentation de matrice particulière utilise. :)

Enfin, notez qu'en fonction de la souplesse de votre système de coordonnées 3D, vous devrez peut-être multiplier MZ par un négatif, afin de générer une matrice de rotation légale pour votre moteur 3D.


Merci beaucoup! Je vais le faire et je vous ferai part de mes résultats.
TheFlash

Merci pour la réponse très utile! Je suis curieux, cependant: le vecteur X n'est-il pas toujours les éléments 0, 1 et 2, quelle que soit la matrice étant la ligne ou la colonne principale? 0, 3 et 6 impliqueraient d'accéder à la première colonne d'une matrice de ligne principale, ou vice-versa.
fbrereto

1
+1 pour au moins affirmer () que les deux vecteurs ne sont pas égaux, mais je pense que vous devriez également exiger qu'ils ne soient pas des vecteurs nuls.
hans_meine

1
Notez que cela ne prend pas en compte un cas où se Xtrouve -Y.
Rafał Cieślak
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.