3DSファイルフォーマット
- 概要
- 公式の仕様書
- フォーマット
- 構文
- 解説
- サンプルファイル
概要
Autodesk社の3D Studioというソフト用のファイルフォーマットです。
多くのCGソフトがサポートし、CGソフトの中間ファイルフォーマットとして広く使用されています。
3D Studio は、3D Studio ⇒ 3D Studio Max
⇒ 3ds Max と、ソフト名が変わっています。
マテリアルデータ、立面図データ、光源データ、視点データの記録にも対応しています。
3DSファイルフォーマットは、バイナリーフォーマットです。
公式の仕様書
筆者は、公式の仕様書の所在を知りません。
公式の仕様書の所在をご存知の方はご一報ください。(「ホーム
> コンタクト」)
フォーマット
構文
バイト数 | データ内容 |
---|---|
2 | チャンクID |
4 | 子や孫のチャンクデータを含めたデータサイズ |
チャンク種類ごとに異なる | チャンクデータ |
2 | チャンクID |
4 | 子や孫のチャンクデータを含めたデータサイズ |
チャンク種類ごとに異なる | チャンクデータ |
2 | チャンクID |
4 | 子や孫のチャンクデータを含めたデータサイズ |
チャンク種類ごとに異なる | チャンクデータ |
2 | チャンクID |
4 | 子や孫のチャンクデータを含めたデータサイズ |
チャンク種類ごとに異なる | チャンクデータ |
解説
エンディアン(endian、byte order)に関してはLittle Endian、Big Endianのどちらが正しいのかは不明です。
「チャンク」というデータ単位の概念があります。
「チャンク」というデータ単位の概念は、ツリー構造になっています。
(下のツリー構造図の各ノードは、
チャンクID (チャンク種類の通称)
となっています。)
0x4D4D (Main chunk) ┣0x3D3D (3D editor chunk) ┃ ┣0x4000 (Object block) ┃ ┃ ┣0x4100 (Triangular mesh) ┃ ┃ ┃ ┣0x4110 (Vertices list) ┃ ┃ ┃ ┣0x4120 (Faces description) ┃ ┃ ┃ ┃ ┗0x4130 (Face material list) ┃ ┃ ┃ ┗(省略) ┃ ┃ ┗(省略) ┃ ┣0xAFFF (Material block) ┃ ┃ ┣0xA000 (Material name) ┃ ┃ ┣0xA010 (Ambient color) ┃ ┃ ┣0xA020 (Diffuse color) ┃ ┃ ┣0xA030 (Specular color) ┃ ┃ ┣0xA040 (Shininess percent) ┃ ┃ ┗(省略) ┃ ┗(省略) ┗(省略) |
2バイトのチャンクID、4バイトの「子や孫のチャンクデータを含めたデータサイズ」、「チャンク種類ごとに異なる」バイトのチャンクデータと続きます。
たとえば、チャンクIDが0x4D4Dのとき、すなわち、Main chunkのとき、「子や孫のチャンクデータを含めたデータサイズ」には、Main
chunkのデータだけでなく、子や孫にあたる3D editor chunkデータやObject blockデータやTriangular meshデータやVertices
listデータを含めたデータサイズになります。
3D editor chunkのときの「子や孫のチャンクデータを含めたデータサイズ」も、3D
Editor chunkのデータだけでなく、子や孫のデータを含めたデータサイズになります。
チャンクデータの記録フォーマットは、チャンク種類ごとに異なります。
3DSファイルフォーマットのすべてを解説するのは困難なので、3Dモデル表現に関するフォーマット部分にフォーカスして解説します。
3Dモデル表現に関係のあるチャンクは、Object block、Vertices list、Faces descriptionです。
- Object block
- オブジェクト名を表す任意の長さの文字列が記録されます。
- Vertices list
- まず、2バイトで、頂点数が記録されます。
続いて、頂点数分の頂点データの記録が続きます。
1つの頂点データは、単精度浮動少数点型(=4バイト) × 3成分(x, y, z) の12バイトで記録されます。 - Faces description
- まず、2バイトで、三角形数が記録されます。
続いて、三角形数分の三角形データの記録が続きます。
1つの三角形データは、頂点番号(=2バイト) × 3頂点 と、3頂点の可視不可視フラグ(2バイト)の8バイトで記録されます。