Techniken zur Matrixinversion

Aus DGL Wiki
Version vom 8. Januar 2009, 13:00 Uhr von Nico Michaelis (Diskussion | Beiträge) (Reine Rotationsmatrizen: Matrix Transposition verlinkt)

Wechseln zu: Navigation, Suche

Techniken zur Matrixinversion

Übersicht

Das Invertieren von Matrizen kommt bei der OpenGL-Programmierung gelegentlich vor. Speichert man z.B. seine Kamera in Matrixform ab, weil die Rotation und Translation der Objekte generell in Matrixform gespeichert wird, so muss man, um die Kameraanalogie zu wahren, die Matrix invertieren. Da man dabei jedoch sehr häufig sehr spezielle Matrizen im Einsatz hat, gibt es hier verschiedene Techniken, um diese Matrizen zu invertieren.

Reine Rotationsmatrizen

Am einfachsten sind reine Rotationsmatrizen zu invertieren. Diese dürfen aus beliebigen Rotationen für den 3-Dimensionalen Raum bestehen. Dann ist eine Inversion unproblematisch, denn es genügt, die Matrix M zu transponieren, d.h. die Zeilen der Matrix als Spalten in die Invertierte Matrix M-1 zu schreiben. Diese Translationsoperation wird häufig auch durch MT bezeichnet.

Translations- und Rotationsmatrizen

Hat man eine OpenGL-Matrix, die aus Rotationen und Translationen besteht, so zerfällt diese in einen seperaten Rotations- und Translationsanteil. Eine Translation um einen Vektor b können wir leicht invertieren, indem wir um -b translieren. Reine Rotationsmatrizen können wir wie bekannt durch Translation invertieren. Betrachtet man OpenGL-Matrizen, so zerfallen sie wie folgt:

r r r b1
r r r b2
r r r b3
0 0 0 1

Die Felder mit r wollen bilden den Rotationsteil und wollen wir als eine 3x3 Matrix R zusammenfassen. Zusätzlich definieren wir den Verschiebungsvektor b := (b1;b2b3).

Statt einer Multiplikation mit unserer Ausgangsmatrix M mit einem Vektor x könnten wir also auch rechnen:

y = Mx = Rx + b ( Achtung: Mathematisch geht das eigentlich nicht, 
                  aber x ist ja 3-Dimensional und nicht 4-D . Damit
                  hier niemand schreit, daß das alles nur Mist ist )

R und b können wir leicht invertieren, also versuchen wir unser Glück und Rechnen auf y mit RT und -b:

RTy - b = RT(Rx + b) - b = RTRx + RTb - b = x + RTb -b

Wir stellen fest: Die Inversion der Rotation hat wunderbar geklappt, aber die Translation ist schiefgegangen. Rechnen wir aber statt -b mit -RTb, so fällt auch der hintere Teil weg:

RTy - RTb = RT(Rx + b) - RTb = x + RTb -RTb = x

Wir kennen jetzt also die Abbildung, die unsere Matrix invertiert. Es handelt sich wieder um eine Rotations + Translation (Wer hätte das gedacht? Verschieben und Rotieren kann man tatsächlich mit Verschieben und Rotieren rückgängig machen ;-) ). Definieren wir noch schnell v := -RTb. Dann stellen wir unsere Inversionsmatrix auf:

rT rT rT v1
rT rT rT v2
rT rT rT v3
0 0 0 1

Wobei nun rT die Komponenten von RT darstellen soll. Diese Matrix invertiert unsere Ausgangsmatrix ohne übderdimensionierte Rechnung, denn wir brauchen ja nur eine Teilmatrix zu transponieren (also eine Vertauschoperation), diese Matrix auf ein Vertex anwenden und in dessen Komponenten die Vorzeichen zu ändern.

Beliebige Matrizen

Beliebige nxn-Matrizen, deren Determinante ungleich 0 ist, lassen sich auch invertieren. Weis man gar nichts über diese Matrix, so empfiehlt es sich mithilfe von LR-Zerlegung und anschließender Vorwärts- und Rückwärtssubstitution die inverse Matrix zu berechnen.

Siehe Auch

Matrizen, glLoadMatrix, glMultMatrix, Quaternionen, Tutorial: Nachsitzen