Diskussion:Techniken zur Matrixinversion: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
Zeile 6: Zeile 6:
  
 
Ich dachte eigentlich, daß Transposition sich eigentlich ganz gut so erklärt. In einer Tabelle zeilen mit Spalten zu vertauschen dürfte doch eigentlich klar sein? Allerdings ist imho Transposition selbst so wichtig, daß es ihr und ihren Eigenschaften in Bedarfsfall auch gerecht wird, ihr einen eigenen Artikel zu spendieren: da kann man dann gerne auch Beispiele bringen und es auch an Vektoren oder nichtquadratischen Matrizen zeigen, da sieht man dann auch etwas mehr - ob man allerdings in der 3D Grafik noch wesentlich mehr Anwendungen findet, als das invertieren von unitären Matrizen, da bin ich mir nicht so sicher - mir fällt zu dem thema jedenfalls nichts wesentliches ein.
 
Ich dachte eigentlich, daß Transposition sich eigentlich ganz gut so erklärt. In einer Tabelle zeilen mit Spalten zu vertauschen dürfte doch eigentlich klar sein? Allerdings ist imho Transposition selbst so wichtig, daß es ihr und ihren Eigenschaften in Bedarfsfall auch gerecht wird, ihr einen eigenen Artikel zu spendieren: da kann man dann gerne auch Beispiele bringen und es auch an Vektoren oder nichtquadratischen Matrizen zeigen, da sieht man dann auch etwas mehr - ob man allerdings in der 3D Grafik noch wesentlich mehr Anwendungen findet, als das invertieren von unitären Matrizen, da bin ich mir nicht so sicher - mir fällt zu dem thema jedenfalls nichts wesentliches ein.
 +
 +
== Matrixinversion direkt mit OpenGL ==
 +
 +
Mir fällt da noch eine ganz einfache Methode für die Berechnung der Matrixinverse ein ;)
 +
 +
Hat man eine Modelview-Matrix setzt sich diese ja bekanntlich als Produkt verschiedener Matrizen mittels glRotate, glTranslate oder glScalef zusammen, also z.B. MV = ( A * B * C ).
 +
Für die Inverse gilt dann MV ^ -1 = ( A * B * C ) ^ -1.
 +
 +
Bei der Matrizenmultiplikation gilt nun, dass sich bei der Auflösung der Klammer auf der rechten Seite die Matrizen vertauschen, also gilt dann :
 +
MV ^ -1 = C ^ -1 * B ^ -1 * A ^ -1.
 +
 +
Man braucht also nur die Matrizenoperationen in umgekehrter Reihenfolge aufschreiben und die 'Inverse' nehmen.
 +
Das bedeutet z.B. dass man bei glTranslate( x, y, z ) als Inverse glTranslate( -x, -y, -z ) und bei glRotate( w, 1, 0, 0 ) als Inverse glRotate( -w, 1, 0, 0 ) nimmt, usw.
 +
 +
Zum Schluss muß man sich die von OpenGL berechnete Matrix nur noch holen...
 +
 +
Hier mal ein Code-Beispiel :
 +
 +
<pre>
 +
//Speicher für Matrix
 +
float M_inv[16];
 +
 +
glMatrixMode( GL_MODELVIEW );
 +
//Einheitsmatrix laden
 +
glLoadIdentity();
 +
   
 +
//glRotate, glTranslate-Befehle in umgekehrter Reihenfolge und 'invertiert'
 +
 +
//Matrix holen
 +
glGetFloatv( GL_TRANSPOSE_MODELVIEW_MATRIX, M_inv );</pre>
 +
 +
[[Benutzer:Dj3hut1|Dj3hut1]] 08:48, 10. Jan. 2009 (UTC)

Version vom 10. Januar 2009, 09:48 Uhr

Es wäre vieleicht noch toll, bei "transponieren" ein Beispiel zu machen.

a1 a5 a9  a13     a1  a2  a3  a4
a2 a6 a10 a14 --\ a5  a6  a7  a8
a3 a7 a11 a15 --/ a9  a10 a11 a12
a4 a8 a12 a16     a13 a14 a15 a16

Ich dachte eigentlich, daß Transposition sich eigentlich ganz gut so erklärt. In einer Tabelle zeilen mit Spalten zu vertauschen dürfte doch eigentlich klar sein? Allerdings ist imho Transposition selbst so wichtig, daß es ihr und ihren Eigenschaften in Bedarfsfall auch gerecht wird, ihr einen eigenen Artikel zu spendieren: da kann man dann gerne auch Beispiele bringen und es auch an Vektoren oder nichtquadratischen Matrizen zeigen, da sieht man dann auch etwas mehr - ob man allerdings in der 3D Grafik noch wesentlich mehr Anwendungen findet, als das invertieren von unitären Matrizen, da bin ich mir nicht so sicher - mir fällt zu dem thema jedenfalls nichts wesentliches ein.

Matrixinversion direkt mit OpenGL

Mir fällt da noch eine ganz einfache Methode für die Berechnung der Matrixinverse ein ;)

Hat man eine Modelview-Matrix setzt sich diese ja bekanntlich als Produkt verschiedener Matrizen mittels glRotate, glTranslate oder glScalef zusammen, also z.B. MV = ( A * B * C ). Für die Inverse gilt dann MV ^ -1 = ( A * B * C ) ^ -1.

Bei der Matrizenmultiplikation gilt nun, dass sich bei der Auflösung der Klammer auf der rechten Seite die Matrizen vertauschen, also gilt dann : MV ^ -1 = C ^ -1 * B ^ -1 * A ^ -1.

Man braucht also nur die Matrizenoperationen in umgekehrter Reihenfolge aufschreiben und die 'Inverse' nehmen. Das bedeutet z.B. dass man bei glTranslate( x, y, z ) als Inverse glTranslate( -x, -y, -z ) und bei glRotate( w, 1, 0, 0 ) als Inverse glRotate( -w, 1, 0, 0 ) nimmt, usw.

Zum Schluss muß man sich die von OpenGL berechnete Matrix nur noch holen...

Hier mal ein Code-Beispiel :

//Speicher für Matrix
float M_inv[16];

glMatrixMode( GL_MODELVIEW );
//Einheitsmatrix laden
glLoadIdentity();
    
//glRotate, glTranslate-Befehle in umgekehrter Reihenfolge und 'invertiert'

//Matrix holen
glGetFloatv( GL_TRANSPOSE_MODELVIEW_MATRIX, M_inv );

Dj3hut1 08:48, 10. Jan. 2009 (UTC)