Ist es möglich, eine 3D-Rotationsmatrix (4x4) in ihre Bestandteile (Rotation, Skalierung usw.) umzuwandeln?

11

Um genauer zu sein, arbeite ich an einer iOS-App und habe eine CATransform3DStruktur (im Grunde ein 4x4-Transformationsarray).

Ist es möglich, alle verschiedenen "Operationen" abzuleiten, die diese Matrix impliziert? Dinge wie wie viel Rotation, Skalierung usw. impliziert es?

elsurudo
quelle

Antworten:

10

Sie können die Matrix M=TRS in grundlegende Transformationen zerlegen : Translation, Skalierung und Rotation. Angesichts dieser Matrix:

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

Sie können die Übersetzung durch Inspektion unter Verwendung der letzten Spalte zerlegen .t=(a03,a13,a23)

Für die Skalierung wissen wir, dass die ersten drei Spalten der Matrix den Basen (Achsen) entsprechen. Wir können die Skalierung durch die Länge / Norm dieser Vektoren erhalten, dh wie stark die Basen skaliert wurden. Die Skala ist also wobei:s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

Wenn Sie nun die Skala haben, können Sie sie mithilfe der -Untermatrix, die R S entspricht, entfernen, indem Sie die Matrix mit der Umkehrung der Skala S - 1 multiplizieren , um R zu erhalten3×3RSS1R

(RS)S1=[a00a01a02a10a11a12a20a21a22][s0000s1000s2]1=[a00a01a02a10a11a12a20a21a22][1/s00001/s10001/s2]

Somit ist ( ):(RS)S1=RI=R

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/s2]

Dies ist die endgültige Rotationsmatrix. Sie können es auf viele Arten weiter zerlegen. Es ist sehr langwierig, aber Sie können nach dem Zerlegen einer Rotationsmatrix suchen .


Diese Methode liefert nur äquivalente Werte in Form von Translation, Skalierung und Rotation (die ursprüngliche Matrix kann das Ergebnis anderer Arten von Transformationen sein). Wenn Sie die zerlegten Winkel weiter verwenden, kann es zu Problemen mit der Gleitkommapräzision bei den Drehwinkeln kommen. Bei den Berechnungen können sich Rundungsfehler ansammeln. Sie sollten es nur verwenden, wenn Sie die Matrix nicht selbst erstellt haben.

tsrTRS

user5488
quelle
2
R
2
Alle Gleitkommazahlen weisen einen intrinsischen (begrenzten) Fehler auf. Jedes Mal, wenn Sie Operationen ausführen, insbesondere Addition oder Subtraktion, erhöhen Sie den Fehler und erhöhen die Größe der Grenzen. Im Zerlegungsalgorithmus sind viele Additionsoperationen (sowohl bei der Matrixmultiplikation als auch bei der Berechnung der Skalengröße) und eine Quadratwurzel (in der Skala) verborgen. Eine weitere Zerlegung führt zu weiteren Fehlern.
Timbo
1
@ Timbo Hier gibt es jedoch keine vollständige Matrixmultiplikation, sondern nur die Spalten der Matrix mit den inversen Skalen. Bei einer Vektorgröße werden alle positiven Größen addiert, sodass dort keine katastrophale Aufhebung erfolgt. es erzeugt nicht viel relativen Fehler, AFAICT. Wie auch immer, der Autor hat klargestellt, dass es darum geht, die Rotationsmatrix weiter in Euler-Winkel oder ähnliches zu zerlegen, was sinnvoller ist.
Nathan Reed
Danke - tolle Antwort. Follow-up: Um die ursprüngliche Matrix wiederherzustellen, gehe ich davon aus, dass wir ausgehend von der Identitätsmatrix eine bestimmte Reihenfolge von Operationen einhalten müssen. Wäre diese Bestellung TRS?
Elsurudo