Impressum Datenschutzerklärung


Papervision3D import von DirectX-Files geschrieben am 10.01.2009

[05.11.2011] update: Erkenntnisse zum Cinema4D Export
[10.1.2009] update: Ich habe was zum Format geschrieben.

[21.10.2008] Nachdem ich mir die aktuelle Version von Papervision3D für Flash heruntergeladen habe. Habe ich einen Importer für DirectX-Dateien (DirectX Mesh Files) geschrieben.

Das Projekt befindet sich in der DirectXLoader.rar(245k), das ich zur freien Verwendung zur Verfügung stelle (Freie Software).

Getestet mit Dateien von Cinema4D 8.2. Lauffähig ab Flash 9.

Neue Version: Mit den Cursortasten kann man in der Welt umherwandern.
Dazu muss einmal in die Szene geklickt werden.

[10.1.2009]Das Format .x

DirectX Mesh Files das Cinema4D 8 ausgibt ist eine Textdatei die so anfängt (Beispiel eines Würfels):

xof 0302txt 0064 // File created by Cinema4D

Es gibt das Format .x auch als Binärformat was ich aber nicht untersucht habe.

Dann folgen verschiedene template-Blöcke die ich überlese:

template Header { <3D82AB43-62DA-11cf-AB39-0020AF71E433> WORD major; WORD minor; DWORD flags; } template Vector <3D82AB5E-62DA-11cf-AB39-0020AF71E433> FLOAT x; FLOAT y; FLOAT z; } ...

Bei den Templates werden die Art der Daten festgelegt, also ob es ein boolscher Wert, ein Float, ein DWORD, ein STRING etc. ist.

irgendwann kommt ein Header-Block:
Header { 1; 0; 1; }

und dann wird es interessant, die Punkte:

Mesh CINEMA4D_Mesh { 8; // W_rfel -100.0;-100.0;-100.0;, -100.0;100.0;-100.0;, 100.0;-100.0;-100.0;, 100.0;100.0;-100.0;, 100.0;-100.0;100.0;, 100.0;100.0;100.0;, -100.0;-100.0;100.0;, -100.0;100.0;100.0;;

die 8 bedeutet das Koordinaten für insgesamt 8 Punkte kommen (aller Objekte). Dann der Name des Objektes und dann die Koordinaten selber. Diese sind in jeweils 3er Blöcke aufgeteilt (x,y,z);
Die Zahl kann 3 Nachkommastellen haben.
Steht zwischendurch ein neuer Kommentar so ist das der Name eines neuen Objektes.

Bei meinem Würfelbeispiel existiert nur ein Objekt, deshalb kommt eine Leerzeile und es geht weiter mit:

6; // W_rfel 4;0,1,3,2;, 4;2,3,5,4;, 4;4,5,7,6;, 4;6,7,1,0;, 4;1,7,5,3;, 4;6,0,2,4;;

Dies ist die Definition für die Flächen (faces), insgesamt sind es 6 Flächendefinitionen.
Flächen können als 3-Ecke oder 4-Ecke definiert sein. Hier steht als erste Zahl eine 4, so sind es 4-Ecke-Flächen.
Die Werte sind die Punktnummern die vorher eingelesen wurden. Z.B. besteht die erste Fläche aus den Punkten Nummer 0,1,3 und 2.

Nachdem wir die Punkte und Flächendefinitionen haben kommt folgender Block:

MeshNormals { 8; // W_rfel -0.577;-0.577;-0.577;, -0.577;0.577;-0.577;, 0.577;-0.577;-0.577;, 0.577;0.577;-0.577;, 0.577;-0.577;0.577;, 0.577;0.577;0.577;, -0.577;-0.577;0.577;, -0.577;0.577;0.577;; 6; // W_rfel 4;0,1,3,2;, 4;2,3,5,4;, 4;4,5,7,6;, 4;6,7,1,0;, 4;1,7,5,3;, 4;6,0,2,4;; }

die überlese ich. Interessant ist der folgende Block:

MeshTextureCoords { 8; // W_rfel 0.0;0.0;, 0.0;1.0;, 1.0;0.0;, 1.0;1.0;, 1.0;1.0;, 1.0;0.0;, 0.0;1.0;, 0.0;0.0;; }

hier wird für jeden Punkt die uv-Koordinate definiert. Also wo der Punkt auf der Textur liegt.

Als nächster großer Block kommt:

MeshMaterialList { 2; 6; 1, 1, 1, 1, 1, 1;

Die erste Zahl gibt an viele viele Materialien definiert sind.
Die Nächste Zahl gibt die Anzahl der Fläche zu Texturdefinitionen an. Hier folgen 6 Zuweisungen.
Dann kommen die Zuweisungen selber. In diesem Beispiel sind alle Flächen der Textur 1 zugewiesen (Zählung beginnt bei 0).

In den folgenden Blöcken kommt die Material-Definitionen selbst:

Material C4DMAT_NONE { 1.0;1.0;1.0;1.0;; 1.0; 0.0;0.0;0.0;; 0.0;0.0;0.0;; } Material C4DMAT_Mat { 1.0;1.0;1.0;1.0;; 1.0; 0.1;0.1;0.1;; 0.0;0.0;0.0;; TextureFilename { "textur.jpg"; } }

Ein Material beginnt mit dem Wort "Material" und dann folgt der Name des Materials. Die nächsten 4 Werte ist die Farbe plus der Alphawert (r,g,b,a). Sie haben eine Wertigkeit von 0.00 bis 1.0.

zum Beispiel:
1.0;1.0;1.0;1.0;; ist Weiß undurchsichtig

1.0;0.0;0.0;0.5;; ist Rot mit 50% Alpha

In der nächsten drei Zeilen beachte ich nicht weiter. Die Zahlen bedeuten Specularpower; Glanzfarbe (specularcolor: r,g,b); Eigenleuchten (emissiveColor: r,g,b).

Wie man oben sieht hat ein Material noch eine Textur (TextureFilename). Um kompatibel mit Flash zu bleiben kann jpg, png, gif oder auch Flashfilme benutzt werden - halt alles was man in Papervision an Texturarten verwenden kann.

Da ich mich an Cinema4D orientiert habe, ist es nur mit dieser Ausgabe kompatibel. Im Textformat könnten die Zeilen auch anders formatiert sein. Da müsste ich mal einen besseren Algorithmus schreiben...

Beispieldatei zum herunterladen:
wuerfel.x
textur.jpg

Literatur

Ich habe noch ein paar Bücher die zum Thema heraus gesucht:
3D Spieleprogrammierung mit DirectX in C/C++
DirectX 9 in Delphi

[upate: 05.10.2011] Hinweis:
Wenn man in Cinema die uv-der Flächen "zerreißt" kommt keine saubere x-Datei heraus.
Z.B. wenn man ein Würfel hat und die uv-Flächen locker nebeneinander legt hat man mehr uv-Punkte als Raum-Punkte - das Ergebnis sind falsche uv-Koordinaten.
Lösung:
Vor dem Export die Modellflächen von einander ablösen (Oberfläche bearbeiten->ablösen).



schreibe den ersten Kommentar:


Inhalt zur freien Verwendung gibs es beim Thema Downloads.
nach oben springen
mehr auf: Instagram, github, thingiverse