Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

09.12.2020, 12:38

So, jetzt muss ich noch mal nachfragen: das STL-Dateiformat liefert Normals mit, da werden zu jedem Polygon (=Dreieck) drei Werte für die Normals "ni nj nk" geliefert. So weit so gut.

Wenn ich mir aber das Wavefront OBJ Dateiformat ansehe, da gibt es zu jedem Vertex drei Werte für die Normals, d.h. bei einem Dreieck gibt's dann insgesamt 9 Werte!

Wenn ich mir die Erklärung https://en.wikipedia.org/wiki/Normal_(geometry) bei Wikipedia ansehe, dann würde ich sagen, STL macht das ganz richtig. Nur: was ist das dann im OBJ Dateiformat? Wieso hat es da so viel mehr Werte?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

12

09.12.2020, 14:44

Stell Dir eine harte Kante vor, zum Beispiel an einem Würfel. Da hat das eine Dreieck an der Kante für die beiden Kantenenden andere Normalen als das andere Dreieck, die Positionen der Kantenenden sind aber für beide Dreiecke gleich.

Die Grafikkarten können seit Anbeginn der Tage indiziert rendern. Das heißt, Du fasst alle Werte eines Eckpunkts zu einem sogenannten Vertex zusammen. Wenn Du einen anderen Satz Werte hast, wo zwar die Position gleich ist, aber ne andere Normale angegeben ist, wird das ein zweiter Vertex. Und dann sagst Du am Ende nur noch "das erste Dreieck besteht aus Vertex #2, #7 und #14".

Wenn Du OBJ-Files lesen willst, musst Du entweder jeden Eckpunkt für sich allein stehen lassen, oder Du fasst Vertizes zusammen, wenn sie in wirklich allen Attributen übereinstimmen. Also Position, Normale und was Du sonst noch so in Deinem Modell hast. Geht ja dann weiter mit Texturkoordinaten, manchmal Tangente und Bitangente, Vertexfarben, wasweißich. Ganz abstrakt betrachtet sind Vertizes eh nur "jeweils ein Satz Werte, die zusammengehören", und es ist Dir und Deinen Shadern überlassen, was für Werte Du pro Vertex brauchst, um schicke Grafik auf den Screen zu kriegen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Jonathan

Community-Fossil

  • Private Nachricht senden

13

09.12.2020, 19:05

Hier nochmal ein Artikel der auch Bilder enthält, die den Unterschied zwischen per-Face und per-Vertex Normal illustrieren:

https://www.scratchapixel.com/lessons/3d…shading-normals
Lieber dumm fragen, als dumm bleiben!

LipkeGu

Frischling

Beiträge: 5

Wohnort: Berlin

  • Private Nachricht senden

14

27.01.2021, 06:37

Wenn ich mir aber das Wavefront OBJ Dateiformat ansehe, da gibt es zu jedem Vertex drei Werte für die Normals, d.h. bei einem Dreieck gibt's dann insgesamt 9 Werte!


Das ist richtig, 3 Werte für die Normals (X, Y, Z) was in OBJ so auch definiert ist.
Entscheident sind die "F"-Definitionen (Faces) diese besagen:

Quellcode

1
f 1/2/[3] 4/5/[6] 7/8/[9]


Benutze für das "Triangle" den 1. Position-Definition, den 2. Texture-Definition und den 3. Normal(s) Eintrag. und verbinde das Vertex mit F-Eintrag 2 (welches wiederum bla bla Position, tex, normal) und dem 3. Vertex, welches wiederum pos, tex, normal hat. Diese Werte sind lediglich nur Index-Einträge, so wie man sie auch in OpenGL (Indices) verwendet.

In einem Konverter / Parser muss man jedoch beachten, dass man bei OpenGL ab 0 zählt. So wird aus f 1/2/3 -> f 0/1/2.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »LipkeGu« (27.01.2021, 06:50)


Werbeanzeige