Diskussion:Techniken zur Matrixinversion

Aus DGL Wiki
Wechseln zu: Navigation, Suche

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)

Ja das ginge schon, aber meistens hat man ja eher das Problem, dass man laengst nicht mehr rekonstruieren kann, wie die matrix entstand, weil recht viele iterationen von rotationen und translationen dahinter stehen und man ja gerade die matrix gespeichert hat, um sich das alles zu merken, die entstehungsdetails aber überflüssig sind. und transponieren ist schon ein sehr billiger vorgang, muss ja nicht einmal addieren oder multiplizieren dazu. Delphic 09:52, 10. Jan. 2009 (UTC)