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?
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.
X
trouve-Y
.