UnlimitedEngine-Blog

"Limited" ist nur die Hardware!!!

Hierarchie einer 3ds-Datei ausgeben

| 1 Kommentar

Ich habe mal mein Testprogramm für das Einlesen einer 3ds-Datei gepackt. Wen es interessiert, kann ja mal schauen wie eine 3ds-Datei so aufgebaut ist.

Das Programm ist relativ simpel gestaltet. Einfach eine 3ds-Datei im selben Verzeichnis der Anwendung hinterlegen (mit dem Namen „test.3ds“). Dann die Anwendung ganz normal starten. Wenn im Konsolenfenster die Meldung „Habe fertig!“ erscheint ist das Programm durchgelaufen und kann beendet werden. Danach sollte im Verzeichnis der Anwendung eine „3dslog.txt“ -Datei zu finden sein. Bei großen 3ds-Dateien wird die Textdatei natürlich sehr groß!!

Wenn jemand einen Fehler feststellt (Programm stürzt ab, Programm gibt Fehlermeldung aus, Programm bleibt hängen, was auch immer) wäre ich sehr froh, wenn mir das Problem mitgeteilt wird.

Getestet habe ich bisher nur 3ds-Dateien welche aus Cinema 4D exportiert wurden. Ich habe noch nicht alle mir bekannten Chunks implementiert. Diese Chunks stehen dann als COSI_3DS_UNKNOWN_CHUNK in der Textdatei.

CosiFramework – 3ds – Download

Wer keine Lust zum selber testen hat => Hier mal die Hierarchie von einem einfachen 6 seitigen triangulierten Würfel.

|
+--COSI_3DS_MAIN3DS ID: 0x4D4D; POSITION: 6; SIZE: 515
   |
   +--COSI_3DS_M3D_VERSION ID: 0x0002; POSITION: 12; SIZE: 10
   |  |
   |  +--ATTRIB Version: 3
   |  |
   |  +--ATTRIB Unknown: 0
   |
   +--COSI_3DS_MESH_DATA ID: 0x3D3D; POSITION: 22; SIZE: 307
   |
   |  +--COSI_3DS_MESH_VERSION ID: 0x3D3E; POSITION: 28; SIZE: 10
   |  |  |
   |  |  +--ATTRIB Version: 2
   |  |
   |  +--COSI_3DS_MASTER_SCALE ID: 0x0100; POSITION: 38; SIZE: 10
   |  |  |
   |  |  +--ATTRIB Scale: 1.00
   |  |
   |  +--COSI_3DS_NAMED_OBJECT ID: 0x4000; POSITION: 48; SIZE: 281
   |     |
   |     +--ATTRIB Name: W_rfel
   |     |
   |     +--COSI_3DS_N_TRI_OBJECT ID: 0x4100; POSITION: 61; SIZE: 268
   |        |
   |        +--COSI_3DS_POINT_ARRAY ID: 0x4110; POSITION: 67; SIZE: 104
   |        |  |
   |        |  +--ATTRIB Num points: 8
   |        |  |
   |        |  +--ATTRIB x: -100.00
   |        |  +--ATTRIB y: -100.00
   |        |  +--ATTRIB z: -100.00
   |        |  |
   |        |  +--ATTRIB x: -100.00
   |        |  +--ATTRIB y: -100.00
   |        |  +--ATTRIB z: -100.00
   |        |  |
   |        |  +--ATTRIB x: 100.00
   |        |  +--ATTRIB y: 100.00
   |        |  +--ATTRIB z: 100.00
   |        |  |
   |        |  +--ATTRIB x: 100.00
   |        |  +--ATTRIB y: 100.00
   |        |  +--ATTRIB z: 100.00
   |        |  |
   |        |  +--ATTRIB x: 100.00
   |        |  +--ATTRIB y: 100.00
   |        |  +--ATTRIB z: 100.00
   |        |  |
   |        |  +--ATTRIB x: 100.00
   |        |  +--ATTRIB y: 100.00
   |        |  +--ATTRIB z: 100.00
   |        |  |
   |        |  +--ATTRIB x: -100.00
   |        |  +--ATTRIB y: -100.00
   |        |  +--ATTRIB z: -100.00
   |        |  |
   |        |  +--ATTRIB x: -100.00
   |        |  +--ATTRIB y: -100.00
   |        |  +--ATTRIB z: -100.00
   |        |
   |        +--COSI_3DS_MESH_MATRIX ID: 0x4160; POSITION: 171; SIZE: 54
   |        |
   |        +--COSI_3DS_FACE_ARRAY ID: 0x4120; POSITION: 225; SIZE: 104
   |           |
   |           +--ATTRIB NumFaces: 12
   |           |
   |           +--ATTRIB Vertex 1: 3
   |           +--ATTRIB Vertex 2: 1
   |           +--ATTRIB Vertex 3: 0
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 5
   |           +--ATTRIB Vertex 2: 3
   |           +--ATTRIB Vertex 3: 2
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 7
   |           +--ATTRIB Vertex 2: 5
   |           +--ATTRIB Vertex 3: 4
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 1
   |           +--ATTRIB Vertex 2: 7
   |           +--ATTRIB Vertex 3: 6
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 5
   |           +--ATTRIB Vertex 2: 7
   |           +--ATTRIB Vertex 3: 1
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 2
   |           +--ATTRIB Vertex 2: 0
   |           +--ATTRIB Vertex 3: 6
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 2
   |           +--ATTRIB Vertex 2: 3
   |           +--ATTRIB Vertex 3: 0
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 4
   |           +--ATTRIB Vertex 2: 5
   |           +--ATTRIB Vertex 3: 2
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 6
   |           +--ATTRIB Vertex 2: 7
   |           +--ATTRIB Vertex 3: 4
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 0
   |           +--ATTRIB Vertex 2: 1
   |           +--ATTRIB Vertex 3: 6
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 3
   |           +--ATTRIB Vertex 2: 5
   |           +--ATTRIB Vertex 3: 1
   |           +--ATTRIB Flag: 7
   |           |
   |           +--ATTRIB Vertex 1: 4
   |           +--ATTRIB Vertex 2: 2
   |           +--ATTRIB Vertex 3: 6
   |           +--ATTRIB Flag: 7
   |
   +--COSI_3DS_KFDATA ID: 0xB000; POSITION: 329; SIZE: 192
      |
      +--COSI_3DS_KFHDR ID: 0xB00A; POSITION: 335; SIZE: 17
      |  |
      |  +--ATTRIB Revision: 5
      |  |
      |  +--ATTRIB FileName: ANIM
      |  |
      |  +--ATTRIB AnimLength: 5
      |
      +--COSI_3DS_OBJECT_NODE_TAG ID: 0xB002; POSITION: 352; SIZE: 169
         |
         +--COSI_3DS_NODE_ID ID: 0xB030; POSITION: 358; SIZE: 8
         |  |
         |  +--ATTRIB ID: 0
         |
         +--COSI_3DS_NODE_HDR ID: 0xB010; POSITION: 366; SIZE: 19
         |  |
         |  +--ATTRIB Name: W_rfel
         |  |
         |  +--ATTRIB Flag 1: 0
         |  |
         |  +--ATTRIB Flag 2: 0
         |  |
         |  +--ATTRIB Flag 3: -1
         |
         +--COSI_3DS_PIVOT ID: 0xB013; POSITION: 385; SIZE: 18
         |  |
         |  +--ATTRIB X: 0.00
         |  |
         |  +--ATTRIB Y: 0.00
         |  |
         |  +--ATTRIB Z: 0.00
         |
         +--COSI_3DS_POS_TRACK_TAG ID: 0xB020; POSITION: 403; SIZE: 38
         |  |
         |  +--ATTRIB Flags: 0
         |  |
         |  +--ATTRIB Parameter 2_1: 0
         |  |
         |  +--ATTRIB Parameter 2_2: 0
         |  |
         |  +--ATTRIB Parameter 2_3: 0
         |  |
         |  +--ATTRIB Parameter 2_4: 0
         |  |
         |  +--ATTRIB Keys: 1
         |  |
         |  +--ATTRIB Unknown: 0
         |
         +--COSI_3DS_ROT_TRACK_TAG ID: 0xB021; POSITION: 441; SIZE: 42
         |  |
         |  +--ATTRIB Flags: 0
         |  |
         |  +--ATTRIB Parameter 2_1: 0
         |  |
         |  +--ATTRIB Parameter 2_2: 0
         |  |
         |  +--ATTRIB Parameter 2_3: 0
         |  |
         |  +--ATTRIB Parameter 2_4: 0
         |  |
         |  +--ATTRIB Keys: 1
         |  |
         |  +--ATTRIB Unknown: 0
         |
         +--COSI_3DS_SCL_TRACK_TAG ID: 0xB022; POSITION: 483; SIZE: 38
            |
            +--ATTRIB Flags: 0
            |
            +--ATTRIB Parameter 2_1: 0
            |
            +--ATTRIB Parameter 2_2: 0
            |
            +--ATTRIB Parameter 2_3: 0
            |
            +--ATTRIB Parameter 2_4: 0
            |
            +--ATTRIB Keys: 1
            |
            +--ATTRIB Unknown: 0

 

Für den Anwender des Framework sieht es Quellcodetechnisch dann so aus.

#include "CosiFramework\CosiFramework.h"
 
int main() {
	try {
		Cosi3dsFile	file3ds;
 
		file3ds.Load3dsFile("./test.3ds", true);
		file3ds.Create3dsLogFile("./3dslog.txt");
	}
	catch(CosiExcErrMsg _e) {
		printf("%s", _e.GetErrMessage());
	}
 
	printf("\n\nHabe fertig!\n\n");
	getchar();
 
	return 0;
}

 

Ich denke viel einfacher kann man einem dass Laden von 3ds-Dateien nicht machen 😉
Um an die eigentlichen Daten wie 3d-Objekte, Lichtquellen, Nodes etc. zu kommen gibt es ganz einfach Get-Methoden in Cosi3dsFile. Das Speichern als 3ds-Format wird zukünfig ebenfalls integriert. Könnte der ein oder andere ja evtl. gebrauchen.

MfG Manuel


Ein Kommentar

  1. Pingback: Das 3ds-Format (3D Studio) | UnlimitedEngine-Blog

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.



*