DGL
https://delphigl.com/forum/

Frage zu gl_NormalMatrix
https://delphigl.com/forum/viewtopic.php?f=20&t=6376
Seite 1 von 1

Autor:  Pellaeon [ So Feb 18, 2007 10:13 ]
Betreff des Beitrags:  Frage zu gl_NormalMatrix

Hiho,

ich befasse mich gerade etwas ausführlicher mit der Shadertheorie, daher hier mal wieder ne Frage^^

Laut Spec ist "uniform mat3 gl_NormalMatrix" die transponierte der auf 3x3 gekürzten ModelView-Matrix.

inverse der ModelView ist soweit klar: damit kann ich einen Vektor aus dem globalen KS in das lokale(also in den "Model-Space") transformieren, um also z.B. den globalen Lichtrichtungsvektor in das lokale System des Normalenvektors zu bekommen.

Aber warum zum Teufel ist die transponiert ?????

edit: bitte verschieben Gemacht (N.M.)
warum postest der das im allgemeinen, ich war doch grade noch im Shader-Board oO

Autor:  Delphic [ So Feb 18, 2007 10:51 ]
Betreff des Beitrags:  Re: Frage zu gl_NormalMatrix

Pellaeon hat geschrieben:
inverse der ModelView ist soweit klar: damit kann ich einen Vektor aus dem globalen KS in das lokale(also in den "Model-Space") transformieren, um also z.B. den globalen Lichtrichtungsvektor in das lokale System des Normalenvektors zu bekommen.

Aber warum zum Teufel ist die transponiert ?????

Also einige Matrizen lassen sich allein durch Transposition invertieren. Dazu gehören alle Matrizen, deren Spalten als Vektoren jeweils alle Länge 1 haben und senkrecht aufeinander stehen. Die kann man auch anders beschreiben: Das sind alle echten Rotationsmatrizen und alle unechten Rotationsmatrizen (sind die Rotationen und gleichzeitug auch noch über eine Achse spiegeln). Das sind dann aber auch alle.
Jedenfalls, wenn du zum erzeugen deiner Modelview Matrix nur glTranslate, glRotate, glLoadIdentity ( sowie glScale, dann aber nur mit Parametern entweder 1 oder -1 -> unechte Rotation. Andere Skalierungen machen das kaputt!) verwendet hast, dann ist die inverse Rotations der Modelview tatsächlich durch das transponieren der linken oberen 3x3 Matrix zu bekommen. (Beweisen kann man das am besten dadurch, daß Rotationsmatrizen das Skalarprodukt erhalten und rechnet das dann einfach aus.) Insofern ist die Aussage mit inversen und transponierten schon richtig, nur nicht ganz global - besser kann ichs aber nicht klären. Jedenfalls kann man leicht verhindern, daß die inverse schon durch transponieren zu haben ist, z.B. durch Einsatz eines glScale(2,1,1) oder glScale(0,0,0), womit klar ist, daß man prinzipiell die Modelview Matrix nicht verlässlich invertieren können muss.

Autor:  Pellaeon [ So Feb 18, 2007 11:42 ]
Betreff des Beitrags: 

achso ok, also in der Spec steht das folgender Maßen:

Zitat:
transpose of the inverse of the upper leftmost 3x3 of gl_ModelViewMatrix


Das hab ich so aufgefasst das halt erst invertiert wird und dann transponiert.
Dann wärs ja doppelt gemoppelt?
Meh steht in der Spec dazu leider irgendwie nicht drinne.
Weil dann würde es ja ja bedeuten, dass die NormalMatrix doch vom lokalen zum globalen transformiert und nicht umgekehrt.

Autor:  LarsMiddendorf [ So Feb 18, 2007 11:58 ]
Betreff des Beitrags: 

In diesem pdf von NVidia ist das genauer erklärt (ab Seite 12). Da sind auch Zeichnungen dabei:
http://developer.nvidia.com/object/math ... hting.html

Autor:  Pellaeon [ So Feb 18, 2007 12:50 ]
Betreff des Beitrags: 

oha danke für den Link!

aber irgendwie kann ich da ein paar Sachen nicht ganz nachvollziehen.
Da steht

n_e = M^(-T) * n_0.

Warum wird das ^(-T)?

Ich kenn das anders:
Man nimmt die ModelView-Matrix und muss die Verschiebung raushauen, damit man sie auf Vektoren anwenden kann.
Verschiebung ist in der 4. Spalte, also einfach aus der 4x4 ne 3x3 machen und jeweils 4. Zeile und Spalte weglassen.

Und die resultierende 3x3-Matrix ist jetzt dazu da, von dem lokalen ins globale KS umzurechnen.
Warum tun die da so umständliche erst inverse machen und dann transponieren?

Autor:  Pellaeon [ So Feb 18, 2007 12:55 ]
Betreff des Beitrags: 

ahh ok jetzt hab ich's, wegen der Skalierung, die sollte man beachten^^

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/