Techniken zur Matrixinversion: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K
K (Markierung "Offline in Bearbeitung" entfernt, denn der Hinweis ist inzwischen 4 Jahre alt.)
 
(4 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 4: Zeile 4:
  
 
=== Reine Rotationsmatrizen ===
 
=== 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<sup>-1</sup> zu schreiben. Diese Translationsoperation wird häufig auch durch M<sup>T</sup> bezeichnet.  
+
Am einfachsten sind reine Rotationsmatrizen zu invertieren. Diese dürfen aus beliebigen Rotationen für den dreidimensionalen Raum bestehen. Dann ist eine Inversion unproblematisch, denn es genügt, die [[Matrixtransposition|Matrix M zu transponieren]], d.h. die Zeilen der Matrix als Spalten in die invertierte Matrix M<sup>-1</sup> zu schreiben. Diese Translationsoperation wird häufig auch durch M<sup>T</sup> bezeichnet.
  
 
=== Translations- und Rotationsmatrizen ===
 
=== Translations- und Rotationsmatrizen ===
Zeile 23: Zeile 23:
 
  y = Mx = Rx + b ( Achtung: Mathematisch geht das eigentlich nicht,  
 
  y = Mx = Rx + b ( Achtung: Mathematisch geht das eigentlich nicht,  
 
                   aber x ist ja 3-Dimensional und nicht 4-D . Damit
 
                   aber x ist ja 3-Dimensional und nicht 4-D . Damit
                   hier niemand schreit, daß das alles nur Mist ist )
+
                   hier niemand schreit, dass das alles nur Mist ist )
 
R und b können wir leicht invertieren, also versuchen wir unser Glück und Rechnen auf y mit R<sup>T</sup> und -b:
 
R und b können wir leicht invertieren, also versuchen wir unser Glück und Rechnen auf y mit R<sup>T</sup> und -b:
 
  R<sup>T</sup>y - b = R<sup>T</sup>(Rx + b) - b = R<sup>T</sup>Rx + R<sup>T</sup>b - b = x + R<sup>T</sup>b -b
 
  R<sup>T</sup>y - b = R<sup>T</sup>(Rx + b) - b = R<sup>T</sup>Rx + R<sup>T</sup>b - b = x + R<sup>T</sup>b -b

Aktuelle Version vom 19. November 2013, 21:59 Uhr

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 dreidimensionalen 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, dass 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