Ich habe 2 Richtungsvektoren für die X-Achse und die Y-Achse des Objekts. Wie berechne ich daraus die Rotationsmatrix des Objekts?
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.
X
ist-Y
.