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

Anonymous

unregistriert

1

19.06.2004, 02:24

Großes Problem mit Vertexdaten, Buffern und Normalvektoren..

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!

Anonymous

unregistriert

2

20.06.2004, 00:08

Wie geht ihr denn vor, wenn ihr Glättungsgruppen habt, und daraus entsprechende Normalvektoren berechnen müsst?

Ich habe mir da eben so ne kleine Strategie überlegt. Wie wäre es, wenn man zunächst die Dreiecke nach Glättungsgruppen sortiert. Dann berechnet man die Normalvektoren aller dieser Vertices und fügt sie dem Vertexbuffer hinzu.
Danach geht man zu den Dreiecken der nächsten Glättungsgruppe, berechnet die Normalvektoren, und fügt sie demselben Vertexbuffer hinzu.

So müssten doch theoretisch alle Vertices korrekt im VB stehen, oder? Korrekt heisst in diesem Fall, dass alle Vertices, die zu 2 Dreiecken verschiedener Glättungsgruppen gehören, auch 2 x im Vertexbuffer (eben mit verschiedenen Normalvektoren) stehen.

Ich kann mir aber vorstellen, dass diese Methode bei größeren Modell Dateien wirklich langsam wird.

Meint ihr, dass wäre eine Lösung? Oder habe ich irgendwas nicht beachtet?

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

3

20.06.2004, 03:57

das gleiche problem hatte ich auch mit uv koordinaten. ich hab es gelöst indem ich das vertice das verschiedene uv koordinaten hat einfach geklont habe. dann musste ich aber die indizes auch korrigieren.
ich werde mich ab morgen auch mit den export von normalen beschäftigen, dann können wir uns ja mal zusammentun zum erfahrungsaustausch.

Anonymous

unregistriert

4

20.06.2004, 14:13

Klar warum nicht. Ich habe mir jetzt mal nen Plan gemacht, wie der Algorithmus aussehen muss, ob alles vernünftig zu verwalten. Werde mich heute Abend oder morgen daran machen, den zu implementieren, ich hoffe das klappt.

Ich vermute aber immernoch, dass der Import dann recht Zeitaufwendig wird. Deshalb werde ich es wohl so machen, dass der Importer mein eigenes Format schreibt, welches ich dann um einiges schneller auslesen kann.

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

5

20.06.2004, 15:41

ein angepasstes format ist wohl das beste, das habe ich auch gemacht.

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

6

21.06.2004, 11:20

Zitat von »"Luke"«

Wie geht ihr denn vor, wenn ihr Glättungsgruppen habt, und daraus entsprechende Normalvektoren berechnen müsst?

warum willst du das den machen? wenn du schon von max die normalen geliefert bekommst.

Anonymous

unregistriert

7

21.06.2004, 11:57

Zitat


warum willst du das den machen? wenn du schon von max die normalen geliefert bekommst.


Ich war mir noch nicht so schlüssig, ob ich nun davon ausgehen soll, dass man die Normalvektoren mit exportiert. Mittlerweile sezte ich das mal voraus :) Ist ja auch sinnvoll, was das Modeln angeht.

Mir ist aber aufgefallen, dass ein Dreieck auch mehreren Glättungsgruppen angehören kann, und das verkompliziert die ganze Sache total.
Ich brauchte die Glättungsgruppen eigentilch nur, um entscheiden zu können, ob ein Vertex nochmal (mit einem anderen Normalvektor) in den Vertexbuffer muss. Daraus ergibt sich nun ein anderer Ansatz, und zwar, dass ich die Glättungsgruppen mal getrost ignoriere, und einfach vor dem Hinzufügen eines Vertex prüfe, ob dieser mit dem angegebenen Normalvektor schon im Buffer ist - ist dem so, dann brauch ich nur noch den Index im IB setzen, ist dem nicht so, so muss der Vertex 2x, und zwar mit einem anderen Normalvektor, im VB stehen.

Leider muss ich dann jedesmal überprüfen, ob sich der Vertex schon im Buffer befindet, und das quasi für jeden Vertex. Daraus ergibt sich eine katastophale quadratische Laufzeit, ich habe keine Ahnung ob das für größere Dateien ZU langsam wird.

Hast zufällig ne Idee, wie man entscheiden kann, ob ein Vertex nochmals hinzugefügt werden muss oder nicht?

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

8

21.06.2004, 16:40

ja, mach die berechnungen beim erstellen deiner datei. dann brauchst du nur aus der datei in den puffer zu kopieren.
und prüfen kannst du nur in dem du alle werte des vertex mit denen vergleichst die du noch brauchst. aber wie gesagt das würde ich vorher machen und daraus eine datei basteln.

Anonymous

unregistriert

9

21.06.2004, 17:19

Quellcode

1
nd prüfen kannst du nur in dem du alle werte des vertex mit denen vergleichst die du noch brauchst


Eben das überlege ich ja, ob es wirklich so gemacht werden muss. Ich denke da an Suchverfahren wie Hashing, um das ganze zu beschleunigen, dann müsste ich ja aus Vertex sowie Normalvektor nen Hash Schlüssel generieren, denn dann abgefragt werden kann... hmm :rolleyes:

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

10

21.06.2004, 17:41

Ich hab da noch nie Hash eingesetzt.

Wenn die Ladezeit wirklich kritisch ist, mach in der Tat ein neues Format was (teilweise) praktisch direkt in die Hardware geschoben werden kann. D.h. es enthält einen VB uind einen IB und noch etwas "Verwaltungsinfo" :).
"Games are algorithmic entertainment."

Werbeanzeige