Warum wird die transponierte Inverse der Modellansichtsmatrix verwendet, um die normalen Vektoren zu transformieren?

22

Beim Rendern von 3D-Szenen mit Transformationen, die auf die Objekte angewendet werden, müssen Normalen mit der transponierten Inverse der Modellansichtsmatrix transformiert werden. Also, mit einem normalen , modelViewMatrix M , die transformierte normalen n ' istnMn

n=(M1)Tn

Bei der Transformation der Objekte ist klar, dass die Normalen entsprechend transformiert werden müssen. Aber warum ist dies mathematisch die entsprechende Transformationsmatrix?

Nero
quelle
Wenn die Modellmatrix aus Translation, Rotation und Skalierung besteht, müssen Sie keine inverse Transponierung durchführen, um die normale Matrix zu berechnen. Teilen Sie einfach die Normale durch die quadratische Skala und multiplizieren Sie sie mit der Modellmatrix, und wir sind fertig. Sie können dies auf jede Matrix mit senkrechten Achsen ausweiten. Berechnen Sie stattdessen die quadratische Skalierung für jede Achse der verwendeten Matrix. Ich habe die Details in meinem Blog geschrieben: lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

Antworten:

22

Hier ist ein einfacher Beweis, dass die inverse Transponierung erforderlich ist. Angenommen, wir haben eine Ebene, die durch eine Ebenengleichung , wobei n die Normale ist. Jetzt möchte ich diese Ebene durch eine Matrix M transformieren . Mit anderen Worten, ich möchte eine neue Ebenengleichung n 'M x + d ' = 0 finden , die für genau dieselben x- Werte erfüllt ist, die die vorherige Ebenengleichung erfüllen.nx+d=0nMnMx+d=0x

Dazu genügt es, die beiden Ebenengleichungen gleich zu setzen. (Dies gibt die Möglichkeit auf, die Ebenengleichungen willkürlich neu zu skalieren, aber das ist für das Argument nicht wichtig.) Dann können wir und subtrahieren. Was wir übrig haben, ist:d=d

nMx=nx

Ich werde dies mit den in Matrixnotation ausgedrückten Punktprodukten umschreiben (die Vektoren werden als 1-Spalten-Matrizen betrachtet):

nTMx=nTx

Um dies nun für alle zu befriedigen , müssen wir haben:x

nTM=nT

Nun wird nach in Bezug auf n aufgelöst ,nn

nT=nTM1n=(nTM1)Tn=(M1)Tn

Presto! Wenn Punkte durch eine Matrix M transformiert werden , müssen Ebenennormalen durch die inverse Transponierung von M transformiert werden, um die Ebenengleichung zu erhalten.xMM

Dies ist im Grunde eine Eigenschaft des Skalarprodukts. Damit das Skalarprodukt beim Anwenden einer Transformation invariant bleibt, müssen die beiden gepunkteten Vektoren auf entsprechende, aber unterschiedliche Weise transformiert werden.

Mathematisch kann dies beschrieben werden, indem gesagt wird, dass der normale Vektor kein gewöhnlicher Vektor ist, sondern ein Ding, das Covektor genannt wird (auch bekannt als kovarianter Vektor, dualer Vektor oder lineare Form). Ein Covektor ist im Grunde genommen definiert als "eine Sache, die mit einem Vektor punktiert werden kann, um einen invarianten Skalar zu erzeugen". Um dies zu erreichen, muss es unter Verwendung der inversen Transponierung der Matrix transformiert werden, die auf gewöhnlichen Vektoren arbeitet. Dies gilt in beliebig vielen Dimensionen.

Beachten Sie, dass ein Bivektor in 3D einem Covektor ähnelt. Sie sind nicht ganz gleich, da sie unterschiedliche Einheiten haben: Ein Covektor hat Einheiten umgekehrter Länge, während ein Bivektor Einheiten quadratischer Länge (Fläche) hat, so dass sie sich beim Skalieren unterschiedlich verhalten. Sie transformieren sich jedoch in Bezug auf ihre Orientierung auf die gleiche Weise, was für Normalen wichtig ist. Normalerweise interessiert uns die Größe eines Normalen nicht (wir normalisieren sie sowieso immer auf die Einheitslänge), sodass wir uns normalerweise nicht um den Unterschied zwischen einem Bivektor und einem Covektor kümmern müssen.

Nathan Reed
quelle
2
tolle Erklärung. Ein bisschen schnell in 2 Punkten, aber ein bisschen mehr Details wären wünschenswert: 1. Wie springen Sie von Punktprodukten zu Matrixprodukten? 2. zwischen der Leitung 2 und 3 der letzte Abschnitt zitiert, was passiert (n von links bewegt ein wenig magisch mir nach rechts)
v.oddou
4
1. (a ^ T) b ist dasselbe wie Punkt (a, b), wenn a und b Spaltenmatrizen derselben Dimension sind. Probieren Sie die Mathematik aus! 2. (AB) ^ T = (B ^ T) (A ^ T) und (A ^ T) ^ T = A Weitere
Informationen zu
3
@ v.oddou Ja, Mokosha ist richtig. Das Skalarprodukt kann als Multiplikation einer 1 × n-Matrix (Zeilenvektor) mit einer × 1-Matrix (Spaltenvektor) ausgedrückt werden. Das Ergebnis ist eine 1 × 1-Matrix, deren einzelne Komponente das Skalarprodukt ist. Die Transponierte eines Spaltenvektors ist ein Zeilenvektor, also können wir a · b als ^ T b schreiben. Für die zweite Frage ist das Umsetzen eines Matrizenprodukts gleichbedeutend mit dem Umsetzen der einzelnen Faktoren und dem Umkehren ihrer Reihenfolge.
Nathan Reed
Perfekt, jetzt ist alles klar. danke euch beiden.
v.oddou
@ NathanReed (Meine Güte, das führt mich zurück zu den frühen PowerVR-Tagen, als wir die meisten Dinge mit Flugzeugen modellierten). Es kann auch erwähnenswert sein, dass zu Optimierungszwecken, wenn Sie eine Matrix Mr haben , die nur Rotationen enthält (dh orthogonal ist), Inverse ( Mr ) = Transpose ( Mr ) und damit Trans (Inverse ( Mr ) = _ Mr_. Sie können auch Verknüpfungen mit der Übersetzung teilnehmen und wenn Sie die Skalierung wissen , ist , einheitliche FWIW in der SGL PowerVR - Grafikbibliothek, wir booleans halten verwendet , um zu verfolgen , ob eine Transformationsmatrix diese Eigenschaften hatten Kosten im Zusammenhang mit den normalen Transformationen zu speichern..
Simon F
6

Dies liegt einfach daran, dass Normalen nicht wirklich Vektoren sind! Sie werden durch Kreuzprodukte erzeugt, was zu Bivektoren und nicht zu Vektoren führt. Die Algebra funktioniert für diese Koordinaten sehr unterschiedlich, und die geometrische Transformation ist nur eine Operation, die sich anders verhält.

Eine großartige Quelle, um mehr darüber zu erfahren, ist Eric Lengyels Präsentation zur Grassman-Algebra .

ap_
quelle
Normalen sind auch sogenannte Pseudovektoren. Als Verallgemeinerung und Faustregel wird alles, was aus einem Kreuzprodukt resultiert (z. B. Flugzeuge), auf ähnliche Weise transformiert.
Matthias