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 ' ist
Bei der Transformation der Objekte ist klar, dass die Normalen entsprechend transformiert werden müssen. Aber warum ist dies mathematisch die entsprechende Transformationsmatrix?
Antworten:
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.n⋅x+d=0 n M n′⋅Mx+d′=0 x
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
Ich werde dies mit den in Matrixnotation ausgedrückten Punktprodukten umschreiben (die Vektoren werden als 1-Spalten-Matrizen betrachtet):
Um dies nun für alle zu befriedigen , müssen wir haben:x
Nun wird nach in Bezug auf n aufgelöst ,n′ n
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.x M M
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.
quelle
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 .
quelle