2010-11-30 12 views
7

Ich experimentiere mit der Verwendung von Achsen-Winkel-Vektoren für Rotationen in meinem Hobby-Spiel-Engine. Dies ist ein 3-Komponenten-Vektor entlang der Rotationsachse mit einer Länge der Rotation im Bogenmaß. Ich mag sie, weil:Kombinieren Rotationsachse Vektoren

  • Anders als Quats oder Drehmatrizen, kann ich eigentlich die Zahlen sehen und die Drehung in meinem Kopf
  • Sie sind ein wenig weniger Speicher als Quaternionen oder Matrizen visualisieren.
  • I-Wert außerhalb des Bereichs von -Pi bis Pi darstellen kann (Dies ist wichtig, wenn ich eine Winkelgeschwindigkeit speichern)

Allerdings habe ich eine enge Schleife, die die Drehung aller meine Objekte aktualisiert (Zehner von Tausenden) basierend auf ihrer Winkelgeschwindigkeit. Momentan besteht die einzige Möglichkeit, zwei Rotationsachsenvektoren zu kombinieren, darin, sie in Quaternionen umzuwandeln, sie zu multiplizieren und dann das Ergebnis zurück in eine Achse/einen Winkel zu konvertieren. Durch das Profiling habe ich dies als Engpass identifiziert. Kennt jemand einen direkteren Ansatz?

+0

das bedeutet, dass drei Werte aufeinanderfolgende Drehungen um 3 orthogonale Achse darstellen? Grundsätzlich gilt, dass Euler-Winkel, so dass '[phi, psi, θ'] 'RX (phi) * RY (psi) * RZ (theta)' darstellen kann. Wenn das der Fall ist, müssen Sie einen Weg finden, die 3x3-Rotationsmatrix zu konstruieren und den Achsenwinkel daraus zu ziehen. – ja72

+0

Nein, ich benutze keine Winkel. Dies ist der Achsenwinkel, wobei die Länge des Vektors der Winkel ist. – Dwayne

Antwort

2

Ihre Darstellung entspricht quaternion rotation, vorausgesetzt Ihre Rotationsvektoren sind Einheitslänge. Wenn Sie eine bestimmte Quaternion-Datenstruktur nicht verwenden möchten, sollten Sie einfach sicherstellen, dass Ihre Rotationsvektoren die Einheitslänge haben, und dann das entsprechende quaternion multiplications/reciprocal computation ermitteln, um die Aggregat-Rotation zu bestimmen. Möglicherweise können Sie die Anzahl der Multiplikationen oder Additionen reduzieren.

Wenn Ihr Winkel das einzige ist, was sich ändert (dh die Rotationsachse ist konstant), dann können Sie einfach eine lineare Skalierung des Winkels verwenden, und wenn Sie möchten, mod es in den Bereich [0, 2 π). Wenn Sie also eine Rotationsgeschwindigkeit von α raidans pro Sekunde haben, ausgehend von einem Anfangswinkel von θ zum Zeitpunkt t , dann der endgültige Drehwinkel zum Zeitpunkt t ist gegeben durch:

θ (t) = θ + α (tt) mod 2 π

Sie dann nur, dass die Drehung um Ihre Sammlung von Vektoren gelten.

Wenn nichts davon Ihre Leistung verbessert, sollten Sie eine vordefinierte Quaternion-Bibliothek in Betracht ziehen, da solche Dinge bereits für die zu bearbeitenden Anwendungen optimiert sind.

+0

1. Meine Vektoren sind nicht Einheitslänge. Ihre Länge ist der Drehwinkel im Bogenmaß. 2. Ich verwende eine Quaternion-Datenstruktur. 3. In vielen Fällen ändert sich nicht nur mein Betrachtungswinkel, sondern dies ist eine gute Optimierungsprüfung. – Dwayne

+0

"Berechnen Sie die äquivalente Quaternionmultiplikationen/reziproke Berechnung, um die aggregierte Rotation zu bestimmen" Ist dies das Gleiche wie die Umwandlung von Achsenwinkel in Quaternion und wieder zurück? Meine aktuelle Implementierung stammt aus der Matrix und Quaternion FAQ (http://www.j3d.org/matrix_faq/matrfaq_latest.html). – Dwayne

1

Sie sollten zur Darstellung Ihrer Rotationen eher Einheitenquaternionen als skalierte Vektoren verwenden. Es kann gezeigt werden (nicht von mir), dass irgendeine Darstellung von Drehungen unter Verwendung von drei Parametern an einem Punkt Probleme (d. H. Ist singulär) aufweisen wird. In Ihrem Fall kommt es vor, dass Ihr Vektor eine Länge von 0 (d. H. Die Identität) und eine Länge von 2pi, 4pi usw. hat. In diesen Fällen wird die Darstellung singulär. Unit-Quaternionen und Rotationsmatrizen haben dieses Problem nicht.

Aus Ihrer Beschreibung klingt es, als würden Sie Ihren Rotationsstatus als Ergebnis der numerischen Integration aktualisieren. In diesem Fall können Sie Ihren Rotationsstatus aktualisieren, indem Sie Ihre Rotationsrate (\ omega) in eine Quaternion-Rate (q_dot) umrechnen.Wenn wir vertreten Ihre quaternion als q = [q0 q1 q2 q3] wo q0 ist die skalare Teil dann:

q_dot = E*\omega 

wo

[ -q1 -q2 -q3 ] 
E = [ q0 -q3 q2 ] 
    [ q3 q0 -q1 ] 
    [ -q2 q1 q0 ] 

Dann wird Ihr Update

q (k + 1 wird) = q (k) + q_dot * dt

für einfache Integration. Sie können einen anderen Integrator auswählen, wenn Sie möchten.

+0

Was bedeutet es für die Rotation, Singular zu werden, und welche Art von Problem wird dies bringen? – Dwayne

+1

Es kann oder kann kein Problem verursachen. Es bedeutet, dass Sie an diesen Orten einen gewissen Freiheitsgrad verlieren. Dies wiederum bedeutet, dass, wenn Sie die Raten zwischen Ihrer Repräsentation und einer anderen (z. B. Quaternionen) transformieren möchten, die Transformationsmatrix (d. H. Jacobi) singulär ist (nicht invertierbar). – Commodore63

2

Sie können sie als Winkelachsenwerte beibehalten.

Erstellen Sie eine produktübergreifende (anti-symmetric) Matrix mit den Winkelachsenwerten (x,y,z) und gewichten Sie die Elemente dieser Matrix, indem Sie sie mit dem Winkelwert multiplizieren. Nun summieren Sie alle diese Produktübergreifenden Matrizen (one for each angle axis value) und finden Sie die endgültige Rotationsmatrix unter Verwendung der Exponentialmatrix.

Wenn die Matrix A repräsentiert diese Kreuzproduktmatrix (gebaut von Winkelachse-Wert) Dann

exp(A) ist äquivalent zu der Rotationsmatrix R(i.e., equivalent to your quaternion in matrix form).

Daher

exp (A1 + A2) = R1 * R2 

wahrscheinlich eine teurer calucation am Ende ...