Hallo liebe Leute,
ich hoffe Ihr könnt mir in dieser Sache weiterhelfen. Es geht um das Laden von Modell Daten sowie den zugehörigen Normalvektoren und auch das erstellen entsprechender Vertex- sowie Indexbuffer.
Der Vertexbuffer [VB] speichert ja alle Vertices, und keines ist doppel. Der Indexbuffer [IB] indiziert nun diese Vertices - alles wunderbar. Nun werde ich gerade mit den Normalvektoren der Vertices und den Glättungsgruppen der Dreiecke konfrontiert. DENN: Möchte ich eine harte Kante haben, so befinden sich 2 Dreiecke ja in verschiedenen Glättungsgruppen.
Das hört sich einfach an, ist für mich aber gerade der totale Overkill - das ganze bedeutet ja, dass die Vertices in meinem VB nicht mehr einzigartig sind, sondern es doch doppelte geben kann bzw. muss, sollte ich irgendwo im Modell eine harte Kante haben.
Ich versuche gerade diese Daten aus einer 3D Studio Max Datei einzulesen (was ja leicht funktioniert) und eben daraus vernünftige Buffer zu erstellen. Momentan bin ich in der Sitation, dass ich folgende Arrays habe, in denen meine Daten sitzen:
- MeshVertices:
Array aller Vertices
- MeshFaces:
Array aller Dreieicke, jede Ecke eines Dreieicks ist nur ein Index auf den entsprechenden Eintrag in MeshVertices
- Ein (noch fiktives) Array mit den Normalvektoren, auch aus der ASE Datei ausgelesen.
Jetzt kann es ja passieren, das Vertices wieder zum VB hinzukommen, nämlich die, dessen Dreiecke dieselben Vertices haben. Denn wenn ein Vertex Teil von 2 Dreiecken ist, die aber in verschiedenen Glättungsgruppen sitzen, muss er ja doppelt im VB stehen. Aber das würde mir ja wieder den Indexbuffer zerhacken, denn wenn ich was im VB änder, dann stimmen die Indexangaben im IB ja nicht mehr.
Ich habe irgendwie keine Ahnung, wie ich das ganze angehen soll, ich habe keine Struktur im Kopf, nach dem mein Programmcode vorgehen sollte. Vielleicht hilft ein kurzer Ausschnitt aus einer ASE Datei:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 2 C: 3 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2
*MESH_FACE 1: A: 3 B: 1 C: 0 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2
*MESH_FACE 2: A: 4 B: 5 C: 7 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3
*MESH_FACE 3: A: 7 B: 6 C: 4 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3
}
*MESH_NORMALS {
*MESH_FACENORMAL 0 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 0 0.0000 0.0000 -1.0000
*MESH_VERTEXNORMAL 2 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 1 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 5 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 6 0.0000 0.0000 1.0000
*MESH_VERTEXNORMAL 4 0.0000 0.0000 1.0000
|
Man sieht also, es gibt 4 Dreiecke (FACE_LIST) sowie 4 Face-Normalen und jeweils dazu noch 3 Vertexnormalen (die Zahlen von 0 bis 7 in der jeweils 2. Spalte beziehen sich auf eine Liste von Vertices vorher). Man kann auch erkennen, dass Dreick 0 & 1 in Glättungsgruppe 2, und Dreiecke 2 & 3 in Glättungsgruppe 3 sind.
Schauen wir uns mal Dreieck 0 & 1 an -> unter den entsprechenden Vertexnormalen gibt es ja doppelte, und zwar hier die 0 und 3. Genau diese beiden Vertices müssten dann ja einen gemittelten Normalvektor bekommen - die anderen müssten doppelt im VB erscheinen, jeweils mit ihrem eigenen Normalvektor.
So langsam erahnt Ihr meine völlige Verwirrung, denke ich mal
???
Ich denke, vom Verständnis war das alles richtig bisher, leider habe ich überhaupt keine Ahnung, wie ich das am besten angehen soll. Ich bin für jegilche Ideen, Tipps oder sonstwas sehr dankbar. Vielleicht hat ja schonmal jemanden einen vergleichbaren Importer geschrieben?
P.S. Ist es vielleicht "einfacher" alle Normalvektoren selbst zu berechnen und irgendwie darauf zu achten, dass die Glättungsgruppen stimmen?
*seufz* :crying:
Vielen Dank für Eure Hilfe!