2010-02-20 8 views
3

J'ai un objet dans l'espace 3D que je veux aligner en fonction d'un vecteur. J'ai déjà obtenu la sortie Y en faisant un atan2 sur les composantes x et z du vecteur. mais je voudrais aussi avoir une rotation X pour que l'objet regarde vers le bas ou vers le haut.Géométrie 3D: comment aligner un objet sur un vecteur

Imaginez un avion qui fait son lancer de tangage, juste sans le rouleau. J'utilise openGL pour régler les rotations, donc j'ai besoin d'un angle Y et d'un angle X.

+0

Donc l'objet a une sorte de vecteur orienté vers l'avant et vous voulez calculer la matrice de rotation nécessaire pour aligner l'objet avec un vecteur choisi arbitraire? – Pace

+0

oui, à peu près comme ça! – clamp

Répondre

1

En fait ... jetez un oeil à this article. Il décrit Euler Angles qui je crois est ce que vous voulez ici.

+0

oui, j'ai déjà trouvé cet article aussi. Je l'étudierai plus profondément. Merci! – clamp

2

Je n'utiliserais pas les angles d'Euler, mais plutôt un axe/angle d'Euler. C'est d'ailleurs ce qu'utilise OpenGL glRotate en entrée.

Si tout ce que vous voulez est de mapper un vecteur à un autre vecteur, il y a un nombre infini de rotations pour le faire. Pour le plus court, (celui avec le plus petit angle de rotation), vous pouvez utiliser le vecteur trouvé par le produit croisé de vos vecteurs unitaires from et to.

axis = from X to 

à partir de là, l'angle de rotation peut être trouvé à partir de from.to = cos(theta) (en supposant que les vecteurs unitaires)

theta = arccos(from.to) 

glRotate(axis, theta) sera ensuite transformer from à to.

Mais comme je l'ai dit, ce n'est que l'une des nombreuses rotations qui peuvent faire l'affaire. Vous avez besoin d'un référentiel complet pour mieux définir comment vous voulez que la transformation soit faite.

3

Vous devez utiliser une certaine forme d'interpolation de quaternion (Spherical Linear Interpolation) pour animer votre objet allant de son orientation actuelle à cette nouvelle orientation.

Si vous stockez les orientations à l'aide de Quaternions (mathématiques vectorielles), vous pouvez obtenir très facilement le chemin le plus court entre deux orientations. Pour un excellent article, veuillez lire le Understanding Slerp, Then Not Using It. Si vous utilisez des angles d'Euler, vous serez soumis à un verrou de cardan et à des étuis de bordure vraiment bizarres.

Questions connexes