KIT-Musterloesungen icon indicating copy to clipboard operation
KIT-Musterloesungen copied to clipboard

CG/2015-Nachklausur, Aufgabe 10 (Bug)

Open crepererum opened this issue 8 years ago • 7 comments

Sollten wir hier nicht die Transformationsmatrix für Normalen anpassen? Also aus

vec3 normal_wc = matO2W * normal;

sollte

vec3 normal_wc = transpose(inverse(matO2W)) * normal;

werden? Der Code-Kommentar auf dem Aufgabenblatt sagt eindeutig, dass die Matrix zur Transformationen von Positionen und nicht (wie hier verwendet) von Normalen dient. Dieses Vorgehen würde auch erklären, warum es hier 9 Punkte gibt.

Ich muss allerdings eingestehen, dass ich schon etwas überrascht bin, dass es eine inverse Funktion in GLSL gibt.

crepererum avatar Mar 04 '16 13:03 crepererum

Ich bin mir da nicht so ganz sicher. Mit fallen dazu zwei Argumente ein:

Einerseits würde niemand, der bei klarem Verstand ist, eine Lösung fordern, die für jedes Fragment die gleiche redundante Berechnung ausführt (inverse), andererseits ist die Matrix eine 3x3-Matrix, was eine lineare, keine affine Transformation bedeutet.

Sollte man vielleicht einen Hinweis dazu packen, dass die Aufgabe nicht eindeutig gestellt ist.

upsj avatar Mar 04 '16 14:03 upsj

Einerseits würde niemand, der bei klarem Verstand ist, eine Lösung fordern, die für jedes Fragment die gleiche redundante Berechnung ausführt (inverse),

Da bin ich voll und ganz mit dir. Implementierungstechnisch wäre das der totaler Unsinn. Hilft aber nix, denn vlt. wird die Transformation im Vertex-Shader dynamisch berechnet, womit du die Inverse dynamisch berechnen müsstest. Dazu kommt, dass scheinbar (habe nichts gegenteiliges gefunden) Matrizen auch interpoliert werden können, siehe https://www.opengl.org/wiki/Type_Qualifier_%28GLSL%29#Interpolation_qualifiers

andererseits ist die Matrix eine 3x3-Matrix, was eine lineare, keine affine Transformation bedeutet.

Foliensatz 3, Folie 57. Eine reine Skallierung, die unterschiedliche Werte für die beiden Achsen aufweißt, zerstört dir bereits die Normalen mit der falschen/simplen Implementierung völlig. Die 3x3 Matrix bedeutet hier lediglich, dass wir keine Translation vornehmen (und einige, eher theoretische Transformationen nicht durchführen können). Da eine Normale eine Richtung ist (w=0), reicht eine 3x3 Matrix allerdings für die "nicht-nur-theoretische" (s.u.) Transformationen auch aus.

Anmerkungen zu seltsamen Transformationen: Theoretisch könntest du eine Matrix bauen, die dir den w Wert auf dem x Wert addiert, womit eine "Richtung" dann doch wieder eine Position wird. Ich sehe aber keinen Grund, warum jemand so etwas machen sollte.

crepererum avatar Mar 04 '16 17:03 crepererum

Der Code-Kommentar auf dem Aufgabenblatt sagt eindeutig, dass die Matrix zur Transformationen von Positionen und nicht (wie hier verwendet) von Normalen dient.

Woraus liest du das? Aus dem "Koordinaten"? Der Kommentar sagt auch, dass die Normal Map "Normalen in Objektkoordinaten" enthält. Ich würde auch eher sagen, dass es nicht so ganz eindeutig ist.

vincent23 avatar Mar 04 '16 18:03 vincent23

@vincent23 OK, guter Einwand. :+1:

crepererum avatar Mar 04 '16 18:03 crepererum

Die Inverse von matO2W ist doch gerade matW2O, sie muss also nicht berechnet werden. Aber es ist wirklich nicht ganz klar ob das transformationsmatrixen für normalen oder vektoren sind.

StephanGocht avatar Mar 07 '16 14:03 StephanGocht

In beiden Fällen sollte die Normale nach der Transformation noch normalisiert werden, oder?

matthiasplappert avatar Mar 07 '16 14:03 matthiasplappert

@matthiasplappert jup.

crepererum avatar Mar 07 '16 16:03 crepererum