Frage

Ich habe ein Projektil Objekt, das entlang einer Geschwindigkeitsvektor bewegt. Ich brauche, um sicherzustellen, dass das Objekt immer in Richtung des Geschwindigkeitsvektors zeigt. Darüber hinaus Ich vertrete Objektrotation quaternions Verwendung nicht-Matrizen.

Ich weiß, dass der erste Schritt ist eine orthogonale Basis zu finden:

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

Wie kann ich die Basis in eine Rotation quaternion umwandeln?

Lösung

Hinweis, würde Ich mag Kredit Noel Hughes geben, um die Antwort zu geben, aber ich will mit meinen eigenen Erfahrungen klären. Pseudo-Code folgt:

   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)

Das letzte Element des Quaternions ist die skalare Teil, die ersten drei Elemente sind die imaginären Teile. Auch nimmt der oben Pseudo-Code, dass Ihr Objekt in „Modellraum“ nach unten zeigt die positive x-Achse. In meinem Fall wies das Objekt tatsächlich die positive y-Achse nach unten, wobei ich folgenden Änderungen vorgenommen:

   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
War es hilfreich?

Lösung

Ich nehme an, Sie nicht um die Ausrichtung des Geschosses ist es egal, andere als die Längsachse mit dem Geschwindigkeitsvektor ausgerichtet ist, und dass die Längsachse ist die x-Achse (1, 0, 0).

Sie befinden sich auf dem richtigen Weg sind. Normalisieren des Geschwindigkeitsvektor (vx, vy, vz) / sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2) kreuzen, die x-Achse mit ihm und normalisiert das Ergebnis - (0, yn, zn) - das ist die Dreh Achse für die Quaternion. Der Drehwinkel ist einfach theta = inverse Kosinus vx / sqrt (vx + vy ^ 2 ^ 2 + vz ^ 2). Die resultierende Quaternion ist dann

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

Lassen Sie mich wissen, wenn Sie Fragen haben.

Noel Hughes nhughes1ster@gmail.com

Andere Tipps

würde ich einen Blick auf die vecmath Bibliothek (Java). Es ist schon eine lange Zeit und wir verwenden es in unserer Gemeinde. Es basiert auf 4-Tupel und ich wäre enttäuscht, wenn es nicht einfach Methoden für die Transformation ist.

Ich würde auch Unit-Tests für die erwarteten Ergebnisse schreiben. Es ist sehr leicht zu verwirren positiv und negativ, links- und rechtshändig und movinig / Referenzrahmen. Beginnen Sie mit den einfachen Ideen (zum Beispiel xyz) um sicherzustellen, dass Sie die richtige Antwort haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top