2008-10-31 11 views
1

J'ai une ligne (en fait un cube) allant de (x1, y1, z1) à (x2, y2, z2). Je voudrais le faire pivoter pour 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?Géométrie 3D: Transformer une paire de points à aligner parallèlement à un autre

Edit: Je pense que j'ai mal écrit ce post. Ce que je cherche réellement est une matrice de rotation de deux vecteurs.

Répondre

4

Oui, vous pouvez le faire sans avoir besoin de penser en termes d'angles du tout. Puisque vous avez un cube, supposons que vous choisissiez un coin et que vous définissiez les 3 arêtes qui en émanent comme vecteurs f0, f1, f2 (ce sont des vecteurs de direction, par rapport au coin que vous avez choisi). Normaliser ceux-ci et les écrire sous forme de colonnes dans une matrice F

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

maintenant faire la même chose pour les vecteurs t0, t1, t2 du cube que vous voulez tourner à l'appeler et matrix T.

maintenant la matrice R = T * Inverse (F) est la matrice qui tourne de l'orientation du premier cube vers l'orientation de la seconde (car l'inverse F cartographie par exemple f0 à (1 0 0) ', puis les cartes T (1 0 0) 'à t0). Si vous voulez savoir pourquoi cela fonctionne, pensez en termes de vecteurs de base du système de coordonnées: si vous voulez faire tourner 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 want (1 0 0) ', (0 1 0)' & (0 0 1) 'à mapper. T * Inverse (F) fait effectivement tourner votre cube de son orientation d'origine à l'axe aligné, puis à l'orientation désirée.

(Désolé pour les vecteurs de colonnes et les transformations à gauche, style OpenGL Je crois me souvenir que Direct3D est un vecteur de ligne et qu'il se transforme sur la droite, mais il devrait être évident de le changer).

Cela s'applique aussi bien aux matrices 4x4 avec un composant de traduction.

+0

En fait ce n'est pas un cube non plus. Une section en acier. Mais cela devrait aider. Merci. –

+0

OK. Le point est que vous devez définir un système de coordonnées local ... si vous avez juste des lignes, la rotation est ambiguë. – timday

+0

Merci, Tim. Je n'ai pas compris pourquoi cela ne devrait pas fonctionner pour les lignes. –

0

Vous pouvez ajouter comment interpoler réellement les matrices. Les matrices source et destination sont correctes 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 en quaternions et lissez celles-ci. Faire un lerp séparé pour la traduction et recomposer. Google pour quaternion - conversions matricielles et arrières et lerp quaternion. Edit: Une matrice de rotation d'un vecteur vers l'avant et vers le haut est triviale. La colonne manquante est le produit croisé des deux autres vecteurs. (n'oubliez pas de normaliser les colonnes).