Question

J'ai un objet projectile qui se déplace le long d'un vecteur vitesse. Je dois m'assurer que l'objet fait toujours face dans la direction du vecteur vitesse. De plus, je représente la rotation d'objet à l'aide de quaternions et non de matrices.

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

forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward) 
up = cross(forward, right)

Comment puis-je convertir la base en quaternion de rotation?

Solution

Remarque, je voudrais remercier Noel Hughes d'avoir fourni la réponse, mais je tiens à préciser ma propre expérience. Le pseudo-code suit:

   vec3 vel = direction of velocity vector
   vec3 forward = (1, 0, 0)  // Depends on direction your model faces. See below.
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit // Already facing the right direction!
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (0, axis.y * sin(theta/2), axis.z * sin(theta/2), cos(theta/2)

Le dernier élément du quaternion est la partie scalaire, les trois premiers éléments sont les parties imaginaires. En outre, le pseudo-code ci-dessus suppose que votre objet dans "espace modèle". pointe vers le bas sur l'axe des x positif. Dans mon cas, l’objet pointait effectivement sur l’axe y positif, auquel cas j’ai apporté les modifications suivantes:

   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
Était-ce utile?

La solution

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

Vous êtes sur la bonne voie. Normalisez le vecteur vitesse, (vx, vy, vz) / sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2) traversez l'axe x avec lui et normalisez le résultat - (0, yn, zn) - c'est la rotation axe pour le quaternion. L'angle de rotation est simplement thêta = cosinus inverse de vx / sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2). Le quaternion résultant est alors

(0, yn, zn) sn (thêta / 2) cos (thêta / 2)

Faites-moi savoir si vous avez des questions.

Noel Hughes nhughes1ster@gmail.com

Autres conseils

Je jetterais un coup d'oeil au bibliothèque vecmath (Java). 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 unitaires pour les résultats attendus. Il est très facile de brouiller les cadres positif et négatif, droitier et gaucher, ainsi que les images animées / de référence. Commencez par les plus simples (par exemple, xyz) pour vous assurer que vous avez la bonne réponse.

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