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
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
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.
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.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
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?
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.