Ich muss die Achse und den Drehwinkel einer Kamera mit einem AUF- und einem Richtungsvektor finden (sie sind beide senkrecht zueinander). Ich habe die Anfangs- und Endpositionen der UP- und Richtungsvektoren der Kamera, die gedreht wird. Ich möchte die Achse und den Winkel der Drehung für die Kamera finden. Ich verwende C# für mein Projekt. Ich bin neu in dieser 3D-Rotation. Also entschuldige meine Fragen, wenn du sie albern findest.Rotationsachse von Anfangs- und Endrotation der Quaternionen erhalten
Antwort
Aus Richtung (vorwärts) Vektor f und vektor u Sie den Seitenvektor s durch Ausführen einer vector cross product (s = f x u) erhalten können. Alle drei Vektoren sind jetzt orthogonal. Sie sollten sie auch orthonormal machen, indem Sie jeden von ihnen normalisieren. Zusammengenommen bilden diese Vektoren eine orthonormale Basis.
Sie haben jetzt zwei solche Basis: die aus Ihrer anfänglichen Kameraausrichtung und die aus Ihrer endgültigen Kameraausrichtung. Beide Grundlagen können als Rotationsmatrix dargestellt werden. Eine Rotationsmatrix ist einfach eine 3x3-Matrix, wo die 3 Reihen jeweils:
- Der Vorwärtsvektor
- Die vektor
- der Seitenvektor
Zum Beispiel kann die Matrix:
könnte Ihre ursprüngliche Kameraausrichtung beim Start mit Vorwärtsvektor, Aufwärtsvektor und Seitenvektorpointin sein g in Richtung der positiven x-Achse, y-Achse bzw. z-Achse.
Sie können jetzt diese zwei Basis (M1 und M2) in zwei Einheitsquaternionen (Q1 und Q2) umwandeln, indem Sie algorithm verwenden, das sich um mögliche Probleme wie Division durch Null kümmert.
An dieser Stelle haben Sie zwei Einheitenquaternionen, die Ihre anfängliche und endgültige Kameraausrichtung darstellen. Sie müssen jetzt die quaternion qT finden, die Q1 in Q2 verwandelt, das heißt:
q2 = qT * q1
q2 * q1^-1 = qT * (q1 * q1^-1) = qT
=> qT = q2 * q1^-1
Wissen, dass die Inverse einer Einheitsquaternion seiner conjugate gleich ist:
q1^-1 = q1* iif ||q1|| = 1
qT = q2 * q1^-1 = q2 * q1*
Es gibt einen einzigen Schritt nach links : extracting the axis and angle from quaternion qT:
angle = 2 * acos(qw)
x = qx/sqrt(1-qw*qw)
y = qy/sqrt(1-qw*qw)
z = qz/sqrt(1-qw*qw)
der Winkel ist natürlich, in Radiant angegeben. Vorsicht vor der Teilung durch Null bei der Berechnung von x, y und z. Diese Situation würde passieren, wenn es keine Rotation oder eine sehr kleine gibt, also sollten Sie testen, ob Winkel> epsilon, wo Sie Epsilon wählen würden, ziemlich klein ist (etwa 1/10 Grad) und den Vektor nicht berechnen, wenn das ist ist der Fall.
Vielen Dank für Ihre Antwort. Das hat mir sehr geholfen. Ich habe ein kleines Problem mit dem Algorithmus, um die Matrix in Quaternion zu konvertieren. Meine Software-Kamera erzeugt einige Aufwärts- und Richtungsvektoren, die eine Spur der Matrix von weniger als eins ergeben. Wenn die Spur der gedrehten Matrix kleiner als eins ist, geben die Berechnungen der Rotationsachse und des Winkels seltsame Werte. Wissen Sie, wie Sie dieses Problem beheben können? – user1304687
Siehe Funktion in Zeile 238: http://java.net/projects/vecmath/sources/svn/content/trunk/src/javax/vecmath/AxisAngle4f.java?rev = 144 Bitte überprüfen Sie diese Antwort, wenn es Ihr Problem löst. – gsimard