Question

J'ai une ligne (en fait un cube) allant de (x1, y1, z1) à (x2, y2, z2). Je voudrais le faire pivoter afin qu'il soit aligné le long d'une autre ligne allant de (x3, y3, z3) à (x4, y4, z4). Actuellement, j'utilise Math :: Atan2 avec Matrix :: RotateYawPitchRoll . De meilleures façons de le faire?

Edit: Je pense avoir très mal rédigé ce post. Ce que je recherche en réalité, c’est une matrice de rotation à partir de deux vecteurs.

Était-ce utile?

La solution

Oui, vous pouvez le faire sans avoir besoin de penser en termes d'angles.

Puisque vous avez un cube, supposons que vous choisissiez un coin, puis que vous définissiez ses 3 arêtes en tant que vecteurs f0, f1, f2 (il s’agit de vecteurs de direction, par rapport au coin que vous avez choisi). Normalisez-les et écrivez-les sous forme de colonnes dans une matrice F

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)

Faites maintenant la même chose pour les vecteurs t0, t1, t2 du cube vers lequel vous souhaitez faire pivoter et appelez-la matrice T.

Maintenant, la matrice R = T * Inverse (F) est la matrice qui tourne de l’orientation du premier cube à l’orientation du second (car F inverse mappe, par exemple, f0 sur (1 0 0) ', puis T cartes (1 0 0) 'à t0).

Si vous voulez savoir pourquoi cela fonctionne, pensez en termes de vecteurs de base de système de coordonnées: si vous souhaitez faire pivoter les axes XY et Z vers un nouveau système de coordonnées, les colonnes de la matrice de rotation ne sont que les vecteurs de votre choix. (1 0 0) ', (0 1 0)' & amp; (0 0 1) 'à mapper. T * Inverse (F) fait effectivement pivoter votre cube de son orientation d'origine à l'axe aligné, puis à l'orientation souhaitée.

(Désolé, le texte ci-dessus concerne les vecteurs de colonnes et les transformations à gauche, style OpenGL. Je semble me souvenir que Direct3D est des vecteurs de lignes et des transformations à droite, mais il devrait être évident de savoir comment le changer.)

Cela s’applique également aux matrices 4x4 comportant un composant de traduction.

Autres conseils

Vous voudrez peut-être ajouter comment interpoler réellement les matrices. Les matrices de source et de destination conviennent bien dans votre réponse, mais le calcul de l'inverse est inutile. Les quaternions vous donneront le chemin de rotation le plus court, prenez donc les matrices de rotation 3x3 sur les deux matrices, convertissez-les en quaternions et lerp celles-ci. Faites un lerp séparé pour la traduction et recomposez. Google pour quaternion - conversions matricielles et inverses et quaternion lerp.

Éditer: Une matrice de rotation à partir d’un vecteur en avant et d’un vecteur en amont est triviale. La colonne manquante est le produit croisé des deux autres vecteurs. (n'oubliez pas de normaliser les colonnes).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top