Langsam möchte ich von den Würfeln und Kugeln weg kommen und anständige Modelle auf dem Bildschirm rumwatscheln sehen. Darum habe ich mich dazu entschlossen ein eigenes Modell-Format zu erstellen, welches auch nur das kann, was es können muss. Der Plan war, ein Modell-Format zu haben, welches sowohl für statische Modelle als auch Animierte Modelle gleichermaßen gut geeignet ist.
Generell ist das Format in drei Kategorien unterteilt (Modell, Meshes, Subsets).
Modell: Das Modell ist die gesammte Datei, es enthält ein oder mehrere Meshes.
Meshes: Die Meshes enthalten Vertices sowie ein oder mehrere Subsets.
Subsets: Die Subsets enthalten Indices.
Der Aufbau wäre dann wohl folgendermaßen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<Version: unsigned int> // Version des Formats
<MeshCount: unsigned int> // Anzahl der Meshes
<MeshVertexCount: unsigned int> // Anzahl der Vertices im Mesh
<MeshVertex: float * 3> // Vertex Daten, in dem Fall nur x, y und z Koordinaten
<MeshVertex: float * 3>
<MeshVertex: float * 3>
...
<SubsetCount: unsigned int> // Anzahl der Subsets im Mesh
<SubsetIndexCount: unsigned int> // Anzahl der Indices im Subset
<SubsetIndex: unsigned int> // Index
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
...
<SubsetIndexCount: unsigned int> // Anzahl der Indices im Subset, leitet ebenso ein neues Subset im Mesh ein
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
...
<MeshVertexCount: unsigned int> // Und auch gleich ein neues Mesh
<MeshVertex: float * 3>
<MeshVertex: float * 3>
<MeshVertex: float * 3>
...
<SubsetCount: unsigned int>
<SubsetIndexCount: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
...
<SubsetIndexCount: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
<SubsetIndex: unsigned int>
...
|
Momentan speichert es nur die x, y und z Koordinaten pro Vertex, dass ist jedoch sehr einfach erweiterbar:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
//@ class: Represents a graphics vertex.
typedef class AysGraphicsVertex
{
public:
float X; //< Holds the x coordinate.
float Y; //< Holds the y coordinate.
float Z; //< Holds the z coordinate.
} AysGraphicsVertex, *lpAysGraphicsVertex;
|
Wenn man der Klasse neue Member hinzu fügt, werden diese auch automatisch übernommen. Ich kann der Klasse zum Beispiel noch zwei Floats hinzufügen, und diese werden dann ohne weitere Änderungen am Code gepspeichert oder geladen. Ich plane auch dies durch ein template zu ersetzten, damit mehr fexibilität zur Laufzeit geboten wird.
ToDo:
- AysGraphicsVertex Klasse durch ein Template ersetzen, oder zumindest ein void Platzhalter.
- Joints bzw Bones unterstützung.
- Animations unterstützung.
- Ein Viewer
- Ein 3DS oder X File Converter
Den Source-Code habe ich
hier hochgeladen. Es ist zwar noch nicht wirklich viel, würde mich aber schon jetzt über große Kritik freuen
Dabei ist ein Model das ich zuvor erstellt habe, es hat einfach überall die Vertex Daten 10 ... Es dient lediglich als Testmodell.