DGL
https://delphigl.com/forum/

Normalen in Viewspace transformieren
https://delphigl.com/forum/viewtopic.php?f=20&t=8481
Seite 1 von 1

Autor:  Sellmann [ So Jun 21, 2009 11:24 ]
Betreff des Beitrags:  Normalen in Viewspace transformieren

Hi, ich habe ein Problem meine Normal in den Viewspace zu tranformieren. Man agt ja, das die Transformation mit der transponierten der inversen ModelView-Matrix erreicht wird und, das diese Matrix durch die gl_NormalMatrix repräsentiert wird in glsl. Mein Problem ist jetzt, dass ich die ModelViewMatrix von Hand setze, da ich meine Camera berechnungen alle losgelöst von den Typischen gl-transformationen mache. Mein Programm spuckt mir jetzt aber ganz merkwürdige Normalen rauß. Um genau zu sein scheint es so, als wenn sich ie Normalen "gegen den Objectspace drehen". Ich habe nicht den hauch einer Ahnung, was ich falsch mache. Ich habe mal eine Anwendung dzugepackt, damit ihr euch das selbst anschauen könnt. Im Shader passiert übrigens nichts großartiges:

vertex shader
Code:
  1.  
  2.   varying vec3 normal;
  3.  
  4.   void main(void)
  5.   {
  6.     normal          = normalize(gl_NormalMatrix * gl_Normal);
  7.     gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   }
  9.  


fragment shader
Code:
  1.  
  2.   varying vec3 normal;
  3.  
  4.   void main(void)
  5.   {
  6.     gl_FragColor          = vec4(vec3(normal.xyz)*0.5+0.5,1.0);
  7.   }
  8.  


Dateianhänge:
Dateikommentar: NormalProblem
NormalProblem.rar [249.28 KiB]
367-mal heruntergeladen

Autor:  Coolcat [ So Jun 21, 2009 11:49 ]
Betreff des Beitrags: 

Zitat:
Mein Problem ist jetzt, dass ich die ModelViewMatrix von Hand setze, da ich meine Camera berechnungen alle losgelöst von den Typischen gl-transformationen mache.

Das ist kein Problem.

Zitat:
Hi, ich habe ein Problem meine Normal in den Viewspace zu tranformieren.

Ich vermute mal du willst gar nicht in den Viewspace transformieren, sondern in den Worldspace, oder? Die Normalen sollen also unabhängig von der Kameraposition sein, d.h. wenn du dich um das Objekt bewegst soll sich in deinem Beispiel die Farbe der Normale nicht ändern.
In dem Fall wäre dein Problem, dass die ModelViewMatrix eben die ModelViewMatrix ist und nicht nur die ModelMatrix.

(ich habe mir dein Programm nicht angeguckt)

Autor:  Sellmann [ So Jun 21, 2009 12:27 ]
Betreff des Beitrags: 

deine Vermutung war leider nicht richtig. Ich möchte, dass die Normalen immer auf den Betrachter ausgerichtet erscheinen, nicht dass sie die Richtung im Raum repräsentieren. So wie es auf vielen Seiten im Netz beschrieben wird einfach normalize(gl_NormalMatrix* glNormal) zu rechnen scheint nicht zu klappen.

Autor:  Coolcat [ So Jun 21, 2009 12:42 ]
Betreff des Beitrags: 

hm, bei mir funktioniert das so.
Sind den die Normalen richtig? Sind die Normalen vielleicht einfach nur falsch rum? Also mal
Code:
  1. normalize(gl_NormalMatrix * (-gl_Normal));

versucht?

Autor:  Sellmann [ So Jun 21, 2009 13:08 ]
Betreff des Beitrags: 

Das hab ich auch schon probiert. Die Lösung ist es leider nicht. Mir ist aufgefallen, das wenn ich frontal auf das gebilde schaue, ohne, dass ich die Camera drehe, dann sind die normalen in Ordnung. Betrachte ich etwas aus einem anderen Winkel, scheint es so, als wenn die Normalen entgegen meiner Rotation um das Model wandern. Es ist etwas schwer zu erklären. Hast du dir das Programm einmal angesehen, das ich mit angehängt habe?

In dem Programm hat man nen Mouselook und steuert mit w a s d und shift/strg sind für hoch/runter entlang der Worldspace-Y-achse. Oder meintest du, dass das Programm bei dir funktioniert. Wenn das der Fall ist, dann hätte ich gerne einmal einen screenshot davon, denn dann müsste ja irgendwas mit meine Rechner nicht stimmen, aber ich gehe eher von meiner mathematischen Inkompetenz aus.

Edit: Ich habe einen kleinen verdacht! Und zwar ist die gl_NormalMatrix eine 3x3Matrix, meine ModelViewMatrix ist allerdings eine 4x4Matrix. Alles halb so wild, aaaaaber in der letzten Zeile der ModelViewMatrix tauchen bei mir punktprodukte auf, wenn ich also jetzt das inverse daraus entwickle und dann transponiere, habe ich automatisch auch werte in der 4.spalte stehen, diese werden aber von er NormalMatrix verworfen, weil sie ja nur 3x3 ist und keine 4.Spalte besitzt. Kommt das in etwa hin, oder ist das blödsinn?

Autor:  Coolcat [ So Jun 21, 2009 14:31 ]
Betreff des Beitrags: 

Zitat:
Edit: Ich habe einen kleinen verdacht! Und zwar ist die gl_NormalMatrix eine 3x3Matrix, meine ModelViewMatrix ist allerdings eine 4x4Matrix. Alles halb so wild, aaaaaber in der letzten Zeile der ModelViewMatrix tauchen bei mir punktprodukte auf, wenn ich also jetzt das inverse daraus entwickle und dann transponiere, habe ich automatisch auch werte in der 4.spalte stehen, diese werden aber von er NormalMatrix verworfen, weil sie ja nur 3x3 ist und keine 4.Spalte besitzt. Kommt das in etwa hin, oder ist das blödsinn?

Die NormalMatrix ist 3x3, weil sie keine Translation beinhaltet. Von daher ist das ok. Probleme gibt es nur wenn du eine Projektion in deine ModelViewMatrix einbaust. Projektion kommt in die Projection-Matrix.

Zitat:
Hast du dir das Programm einmal angesehen, das ich mit angehängt habe?

Nein, habe weder Delphi noch Windows ;) Kannst ja mal nen paar Screenshots machen :)

Autor:  Sellmann [ So Jun 21, 2009 15:48 ]
Betreff des Beitrags: 

So hier mal 3 Screenshots. Auf dem ersten ist der Effekt mit normal = normalize(gl_Normal); aufgenommen. So wie diese Farben zu sehen sind, soll es immer aussehen und zwar von egal wo betrachtet. Das zweite und dritte Bild zeigen, wie sich die Normalen aber tatsächlich verhalten.

meine modelviewmatrix erstelle ich übrigens aus der Orientierung der Camera, im etwa so:
Code:
  1.  
  2.   tmpMat[0] := FOrigin.right.x;
  3.   tmpMat[1] := FOrigin.top.x;
  4.   tmpMat[2] := -FOrigin.front.x;
  5.   tmpMat[3] := 0;
  6.  
  7.   tmpMat[4] := FOrigin.right.y;
  8.   tmpMat[5] := FOrigin.top.y;
  9.   tmpMat[6] := -FOrigin.front.y;
  10.   tmpMat[7] := 0;
  11.  
  12.   tmpMat[8] := FOrigin.right.z;
  13.   tmpMat[9] := FOrigin.top.z;
  14.   tmpMat[10] := -FOrigin.front.z;
  15.   tmpMat[11] := 0;
  16.  
  17.   tmpMat[12] := dot3(FOrigin.pos,smul3(-1,FOrigin.right));
  18.   tmpMat[13] := dot3(FOrigin.pos,smul3(-1,FOrigin.top));
  19.   tmpMat[14] := dot3(FOrigin.pos,FOrigin.front);
  20.   tmpMat[15] := 1;
  21.  


Dateianhänge:
Dateikommentar: von er Seite gesehen stimmts auch nicht
normalen3.jpg
normalen3.jpg [ 33.78 KiB | 7194-mal betrachtet ]
Dateikommentar: etwas von unten betrachtet passte keine der Farben mehr.
normalen2.jpg
normalen2.jpg [ 13.7 KiB | 7194-mal betrachtet ]
Dateikommentar: so wie es immer aussehen sollte
normalen1.jpg
normalen1.jpg [ 24.98 KiB | 7194-mal betrachtet ]

Autor:  oc2k1 [ So Jun 21, 2009 18:06 ]
Betreff des Beitrags: 

Die Normalmatrix ist die transposed inverse obere/linke 3x3 teil der Modelviematrix, wenn nicht gestaucht/scaliert wird kann es sein, das der 3x3 teil so funktioniert.

Autor:  Sellmann [ Mo Jun 22, 2009 18:45 ]
Betreff des Beitrags: 

Okay ich habs! Vorweg entschuldigung fürs quälen mit dieser Frage. Das Problem lag nicht an der Matrix, sondern an den Normalen. Ich habe in dem Modelloader die Formel zur Errechnung der Normalen abgeändert um sie als Farbwerte darstellen zu können. Das Problem war anschließend, das ich diese Normalen, die jetzt falsch waren, zusätzlich mit der NormalMatrix multipliziert habe und anschließend wieder die Verschiebung durchgeführt habe um sie darstellen zu können. Darufhin kam ein totales Kaudawelsch zustande. Das makabere ist, dass ich besagte Codezeile auch noch kommentiert habe mit "An dieser Stelle verschiebe ich die Normalen um sie als Farben zu verwenden UNBEDINGT DRAN DENKEN!!!"... irgendwie peinlich, aber ich bin glücklich, dass es jetzt funktioniert.

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