7
votes

Quaternion de base orthogonale

J'ai un objet projectile qui se déplace le long d'un vecteur de vélocité. Je dois m'assurer que l'objet est toujours confronté dans la direction du vecteur de vitesse. En outre, je représente une rotation d'objet à l'aide de quaternions, pas de matrices.

Je sais que la première étape consiste à trouver une base orthogonale: p> xxx pré>

Comment puis-je convertir la base dans un quaternion de rotation? p>

Solution forte> P>

Note, j'aimerais donner crédit à Noel Hughes pour fournir la réponse, mais je veux clarifier avec mes propres expériences. Pseudocode suit: P>

   vec3 vel = direction of velocity vector
   vec3 forward = (0, 1, 0)  // Note that y-component is now 1
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit 
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (axis.x * sin(theta/2), 0, axis.z * sin(theta/2), cos(theta/2)
   // Note that SECOND component above is now 0


1 commentaires

Voir aussi Cette réponse , qui considère l'axe mondial pour maintenir le quaternion de rouler.


3 Réponses :


-1
votes

J'aurais un coup d'œil sur le Bibliothèque de Vecmath (Java). Cela fait longtemps que cela fait longtemps et nous l'utilisons dans notre communauté. Il est basé sur 4-tuples et je serais déçu s'il n'y avait pas de méthodes simples pour la transformation.

J'écrirais également des tests d'unité pour les résultats attendus. Il est très facile de me mêler positif et négatif, gaucher et droitier, et des cadres de movinig / de référence. Commencez avec les simples (par exemple XYZ) pour vous assurer de la bonne réponse.


0 commentaires

4
votes

Je suppose que vous ne vous souciez pas de l'orientation de votre projectile, à part à avoir l'axe longitudinal aligné sur le vecteur de vitesse et que l'axe longitudinal est l'axe x de (1, 0, 0).

Vous êtes sur la bonne voie. Normaliser le vecteur de vitesse (VX, VY, VZ) / SQRT (VX ^ 2 + VY ^ 2 + VZ ^ 2) Traverser l'axe X avec elle et normaliser le résultat - (0, YN, Zn) - c'est la rotation Axe pour le quaternion. L'angle de rotation est simplement THETA = cosinus inverse de VX / SQRT (VX ^ 2 + VY ^ 2 + VZ ^ 2). Le quaternion résultant est alors

(0, yn, zn) sn (theta / 2) cos (theta / 2)

laissez-moi savoir si vous avez des questions.

Noel Hughes nhughes1ster@gmail.com


2 commentaires

Donc, je peux construire le quaternion en utilisant (0, YN, Zn) comme axe de rotation et thêta comme angle de rotation? J'ai une méthode de création d'un quaternion de cette façon: qx = hache * sin (angle / 2) qy = ay * sin (angle / 2) qz = az * sin (angle / 2) qw = cos (angle / 2)


Je souhaite que cette réponse n'a pas ignoré l'orientation (rouleau) du projectile et ignore l'axe . Cette réponse est bonne pour un projectile, mais pas de bien pour une caméra!



0
votes

Voici une solution qui correspond mieux au titre: "Quaternion de base orthogonale"

La question et les réponses telles que indiquées ci-dessus abordent le problème de l'alignement d'un quaternion le long d'un vecteur ("pointant") mais ignorer la torsion (orientation). Une base orthonormale complète inclut la direction, le côté et la partie (une de celles étant redondantes mais pas deux). La question originale ne considère que la direction.

Une solution pour quaternions-de-orthogonal peut être trouvée en plaçant les vecteurs 3x dans les colonnes d'une matrice, puis convertissant la matrice en quaternion. Cependant, cette méthode nécessite un stockage de matrice supplémentaire (6x flottants) en plus du quaternion, et est assez lent.

Une meilleure solution est trouvée en écrivant les vecteurs de base A, B, C et de la branches dans la conversion matricielle à quaternion, où les éléments sont explicites. (Cette matrice est en colonne majeur, opengl forme) xxx

maintenant, nous réécrivons la fonction matricielle à quaternion à l'aide des vecteurs d'orthonormaux substitués A, B, C. Le résultat est la fonction suivante: xxx

Cette fonction donne un quaternion (x, y, z, w) directement des vecteurs de base orthonormaux A, B, C sans stockage intermédiaire d'une matrice. (Matrices ci-dessus dans la forme Column-Major, OpenGL). Vous devrez peut-être toujours normaliser le quaternion. Si vous avez une direction et un vecteur haut, disons pour une caméra, vous pouvez construire la base comme: A = dir, B = UP, C = Croix (Dir, UP)


0 commentaires