Wie berechnet man eine 3x3-Rotationsmatrix aus 2 Richtungsvektoren?


10

Ich habe 2 Richtungsvektoren für die X-Achse und die Y-Achse des Objekts. Wie berechne ich daraus die Rotationsmatrix des Objekts?

Antworten:


17

Die Grundidee besteht darin, ein Kreuzprodukt zu verwenden , um die zusätzlichen orthogonalen Achsen Ihrer Rotationsmatrix basierend auf den bereits vorhandenen Achsen zu generieren.

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

Beachten Sie, dass das oben Gesagte keine Annahmen über X- und Y-Vektoren macht (abgesehen davon, dass sie nicht identisch sind) und eine Menge zusätzlicher Berechnungen durchführt, die in Ihrer Situation möglicherweise nicht erforderlich sind.

In diesem Code mache ich beispielsweise ein zweites Kreuzprodukt, um sicherzustellen, dass unsere Matrix eine orthogonale Y-Achse erhält, anstatt blind darauf zu vertrauen, dass die eingegebenen X- und Y-Achsen genau 90 Grad voneinander entfernt sind. Wenn Sie in Ihrer Situation sicher sind, dass Ihre Eingabeachsen wirklich orthogonal zueinander sind, können Sie das zweite Kreuzprodukt überspringen und den Eingabe-Y-Vektor direkt zuweisen, anstatt ihn neu zu berechnen.

Beachten Sie, dass ich davon ausgehe, dass Ihre Matrixdarstellung über zugängliche 'X-, ​​Y-, Z'-Vektorelemente verfügt. Einige Implementierungen legen stattdessen nur ein Array von neun Gleitkommazahlen frei. In diesem Fall besteht der 'X'-Vektor entweder aus den Elementen 0, 1 und 2 oder aus 0, 3 und 6, je nachdem, ob die Matrix zeilen- oder spaltenweise ist. Haupt. In dieser (ärgerlichen) Situation finde ich es normalerweise einfacher, einfach beide Möglichkeiten auszuprobieren und zu sehen, welche funktioniert, als die Dokumentation zu durchsuchen, um herauszufinden, welche Reihenfolge Ihre bestimmte Matriximplementierung verwendet. :) :)

Beachten Sie schließlich, dass Sie abhängig von der Händigkeit Ihres 3D-Koordinatensystems möglicherweise MZ mit negativ multiplizieren müssen, um eine zulässige Rotationsmatrix für Ihre 3D-Engine zu erstellen.


Vielen Dank! Ich werde das tun und Sie über meine Ergebnisse informieren.
Robinicks

Vielen Dank für die sehr hilfreiche Antwort! Ich bin jedoch neugierig: Ist der X-Vektor nicht immer die Elemente 0, 1 und 2, unabhängig davon, ob die Matrix Zeilen- oder Spaltenmajor ist? 0, 3 und 6 würden bedeuten, auf die erste Spalte einer Zeilenhauptmatrix zuzugreifen oder umgekehrt.
fbrereto

1
+1, um zumindest zu behaupten (), dass die beiden Vektoren nicht gleich sind, aber ich denke, Sie sollten auch verlangen, dass sie keine Nullvektoren sind.
Hans_meine

1
Beachten Sie, dass dies einen Fall nicht berücksichtigt, in dem dies der Fall Xist -Y.
Rafał Cieślak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.