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

1

27.07.2010, 18:26

*.Aym - Das Abyssus-Modell-Format

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.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

27.07.2010, 19:16

Ich vermisse ein Vergleich zu existierenden Formaten. Warum sollte man es z.B. 3ds, x oder collada vorziehen?

3

27.07.2010, 19:28

Nunja, ich kenne mich nicht wirklich mit anderen Formaten aus. Was ich aber weiß ist, dass sie in der Regel viel zu komplex sind. Ich möchte ein einfaches, klar Strukturiertes Format, das an mein Spiel angepasst ist. Ich befasse mich gerade mit Quaternions, und mein Format wird wohl sehr ähnlich dem MD5 Format sein, bis auf die Tatsache, das es binär gespeichert ist, was das laden schneller machen sollte, und vor allem, weniger Speicher verschwenden sollte. Mein Format wird definitiv nicht so viel können wie beispielsweise das 3DS Format, aber genau das ist auch der Sinn der Sache ;)

Eine weitere ToDo die mir auch gerade eingefallen ist: Ich füge dem Format eventuell ein Index hinzu. Dadurch kann man zum Beispiel bestimmte Meshes aus dem Format schnell auslesen, ohne den ganzen Binärcode zu durchwühlen.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Potatoman« (27.07.2010, 19:34)


4

27.07.2010, 20:06

Ich bin imemr noch der Meinung, dass es schon viel zu viele 3D Formate gibt. Wenn man später mal irgendwas modden oder wiederverwenden will, muss man direkt einen neuen Loader schreiben oder kommt gar nicht mehr an die Daten, weil kein Mensch das Format kennt.
Ich finde auch nicht, das andere Formate unbedingt zu komplex sind, es gibt ja jetzt nicht so schrecklich viele Dinge, die man Speichern könnte (außer bei Materialien, da kann es wirklich eklig werden, weil jede Engine die ganz anders behandelt). Ich persönlich benutze Assimp, was eigentlich ne prima Sache ist, weil man eine Menge Formate direkt laden kann.

Aber gut, es ist natürlich ein schönes Projekt, sowas mal zu schreiben; man lernt halt was dabei und so.
Lieber dumm fragen, als dumm bleiben!

5

27.07.2010, 20:36

Klar, es gibt haufenweise 3D formate, aber wie du schon sagtest, man lernt dabei ungemein. Ich habe noch nie binäre Dateien gelesen oder geschrieben, und jetzt möchte ich nix anderes mehr machen. Ich finde es ist viel einfacher Daten binär zu lesen oder schreiben. Und sollte daraus tatsächlich mal ein brauchbares Spiel werden, und sollte ich dort modding zulassen, werde ich alle Informationen die man dazu braucht natürlich öffentlich anbieten.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Werbeanzeige