PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NORMALS


Capt'N Coax
2003-02-11, 22:35:59
Yepp, Ich binnet wieder...

Wollte endlich mal Normalz in OpenGL einführen, so dass ich gezwungen bin meinen ASE Konverter aufm neuesten Stand zu bringen.
Also flux Beispiel gebastelt in 3dMax , quader exportiert und siehe da, der Junge gibt mir pro Vertex 3 (!) Normals aus, die in jede Richtung zeigen.
Also wieder rinn in 3D Max, Normals normalisiert (haha)und wieder exportiert. Immer noch 3 Normals, die aber alle in die Selbe Richtung zeigen.

Meine Frage:
Wozu brauch ich pro Vertex 3 Normals? Macht das Lightning noch Smoother?
Oder soll ich hergehen und die Dinger sozusagen von Hand berechnen, also 1 Normal per Vertex?
Das Problem ist natürlich, das ich die 3D Max Objekte schon gerne so wie sie sind exportieren würde, allerdings gibt mir die Struktur nicht viel:

*MESH_NORMALS {

*MESH_FACENORMAL 0 0.0000 0.0000 1.0000
*MESH_VERTEXNORMAL 0 0.0000 0.0000 1.0000
*MESH_VERTEXNORMAL 1 0.0000 0.0000 1.0000
*MESH_VERTEXNORMAL 3 0.0000 0.0000 1.0000

*MESH_FACENORMAL 1 0.0000 0.0000 1.0000
*MESH_VERTEXNORMAL 3 0.0000 0.0000 1.0000
*MESH_VERTEXNORMAL 2 0.0000 0.0000 1.0000
*MESH_VERTEXNORMAL 0 0.0000 0.0000 1.0000

*MESH_FACENORMAL 2 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 4 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 6 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 7 0.0000 0.0000 -1.0000

*MESH_FACENORMAL 3 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 7 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 5 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 4 0.0000 0.0000 -1.0000

*MESH_FACENORMAL 4 0.0000 -1.0000 0.0000
*MESH_VERTEXNORMAL 0 0.0000 -1.0000 0.0000
*MESH_VERTEXNORMAL 4 0.0000 -1.0000 0.0000
*MESH_VERTEXNORMAL 5 0.0000 -1.0000 0.0000

*MESH_FACENORMAL 5 0.0000 -1.0000 0.0000
*MESH_VERTEXNORMAL 5 0.0000 -1.0000 0.0000
*MESH_VERTEXNORMAL 1 0.0000 -1.0000 0.0000
*MESH_VERTEXNORMAL 0 0.0000 -1.0000 0.0000

*MESH_FACENORMAL 6 1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 1 1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 5 1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 7 1.0000 0.0000 0.0000

*MESH_FACENORMAL 7 1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 7 1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 3 1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 1 1.0000 0.0000 0.0000

*MESH_FACENORMAL 8 0.0000 1.0000 0.0000
*MESH_VERTEXNORMAL 3 0.0000 1.0000 0.0000
*MESH_VERTEXNORMAL 7 0.0000 1.0000 0.0000
*MESH_VERTEXNORMAL 6 0.0000 1.0000 0.0000

*MESH_FACENORMAL 9 0.0000 1.0000 0.0000
*MESH_VERTEXNORMAL 6 0.0000 1.0000 0.0000
*MESH_VERTEXNORMAL 2 0.0000 1.0000 0.0000
*MESH_VERTEXNORMAL 3 0.0000 1.0000 0.0000

*MESH_FACENORMAL 10 -1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 2 -1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 6 -1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 4 -1.0000 0.0000 0.0000

*MESH_FACENORMAL 11 -1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 4 -1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 0 -1.0000 0.0000 0.0000
*MESH_VERTEXNORMAL 2 -1.0000 0.0000 0.0000
}

Also, brauch ich 3 Normals per Vertex, wenn ja warum, oder soll ich nur einen Normal per Vertex berechnen oder gibt es in 3D max ne Option die mir nur einen Normal p.V. ausgibt???

Schon mal danke fürs lesen,

de Capt'N

zeckensack
2003-02-11, 22:42:39
Nö.

Max speichert die Ecken eines Quaders nur jeweils einmal, das kannst du für OGL aber nicht gebrauchen.
An jeder Ecke laufen ja drei Flächen zusammen. Jede dieser Flächen braucht eine eigene Normale, weil'se in eine andere Richtung zeigt. Logisch.
Max speichert die Ecke jetzt nur einmal als Vertex und weist drei Normalen zu, was im Grunde eine blödsinnige Optimierung ist.
Du mußt die Vertices vervielfachen, sodaß du jeden Eckpunkt dreimal hast. Die haben dann alle die gleiche Raumkoordinate, kriegen aber eine eigene Normale.

Ich hoffe das machte Sinn :|

Capt'N Coax
2003-02-11, 23:16:22
Hehehe, thx für die schnelle Antwort...

Moment, mal sehen ob ich das kapier:

Mir ist klar, das jedes FACE eine Normale hat.
Die lassen sich ja auch Problemlos extrahieren.

Korrigier mich wenn ich falsch liege, aber bildet sich eine Normale eines VERTEXES nicht aus den 3 dazugehörigen Faces?

Sollte ich also eine Ecke (Vertex) eines Quaders haben, so müsste die Normale von da aus schräg in den Raum zeigen, quasi das Mittelding aus allen 3 Richtungen...

Verdammich, 3dMax speichert das wirklich bescheuert...

Capt'N Coax
2003-02-11, 23:31:20
Yepp, Ok, hat sich erledigt, habs gefressen

THX nochamal!

Xmas
2003-02-11, 23:37:26
Originally posted by Capt'N Coax
Korrigier mich wenn ich falsch liege, aber bildet sich eine Normale eines VERTEXES nicht aus den 3 dazugehörigen Faces?
Nicht grundsätzlich, nur wenn die Faces zu einer relativ "smoothen" Oberfläche gehören, die mit Gouraud Shading geglättet werden soll. (Es sind auch nicht zwangsläufig drei Flächen die sich in einem Vertex treffen)

Im Falle eines Quaders ist das aber nicht brauchbar, hier gibt es keine Rundung. Um eine scharfe Kante zu erhalten, muss man die Eckpunkte aber duplizieren und jeder Kopie eine eigene Normale geben.

Capt'N Coax
2003-02-12, 00:23:22
Nicht grundsätzlich, nur wenn die Faces zu einer relativ "smoothen" Oberfläche gehören, die mit Gouraud Shading geglättet werden soll. (Es sind auch nicht zwangsläufig drei Flächen die sich in einem Vertex treffen)

-- Kloar, is logisch.

Im Falle eines Quaders ist das aber nicht brauchbar, hier gibt es keine Rundung. Um eine scharfe Kante zu erhalten, muss man die Eckpunkte aber duplizieren und jeder Kopie eine eigene Normale geben.

-- Bei einem Quader wirkt sich das nicht aus, is klar.
Allerdings versteh ich das mit den Eckpunkte duplizieren net.

Prinzipiell würde ich sagen, das Face-Normals vollkommen ausreichen, um eckige Objekte darzustellen, Flat Shading mäßig. Wenn keine Objektübergreifende Glättung nötig ist.
Für organische Darstellung oder vielleicht für Terrain Vertex Normals, sonst sieht das ganze recht dämlich aus...

Offensichtlich muss ich mir hier noch einiges angucken, bin immer wieder überrascht mit was für Sachen die Leute noch so ankommen ;)

Naja, wird schon

Kant
2003-02-12, 01:07:08
Originally posted by Capt'N Coax
-- Bei einem Quader wirkt sich das nicht aus, is klar.
Allerdings versteh ich das mit den Eckpunkte duplizieren net.


Stell dir vor, du wolltest diesen Quader jetzt aus einem Vertex-Array heraus rendern.
in einem Array sind die Vertex-Koord (x,y,z)
in einem anderen die Normalen(x,y,z).
Und im dritten die indizies der zu zeichnenden Faces (v1,v2,v3)

Die Face-Indizies beziehen sich aber immer gleichzeitig auf Vertex-Koord/Normal. D.h, um den Quader richtig zu rendern muss jede Eck-Vertex 3x vorhanden sein. Mit gleicher x/y/z Koord, aber unterschiedlicher Normal.
Also musst du diese Verts duplizieren....

Capt'N Coax
2003-02-12, 02:03:15
ach so, alles klar. :D