.Xを読み込んでみる1(解析編)

DirectXの .X形式のファイルを読み込んで表示できると便利です。
現在の3Dアプリでは .X と .FBX が主に広く使われているようです。
では、例によってメタセコイアで .X を出力して中を見てみます。
三角ポリゴンを一枚だけ作って保存したものをメモ帳で開いてみます。

xof 0302txt 0064
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;
}

template Coords2d {
 <F6F23F44-7686-11cf-8F52-0040333594A3>
 FLOAT u;
 FLOAT v;
}

template Matrix4x4 {
 <F6F23F45-7686-11cf-8F52-0040333594A3>
 array FLOAT matrix[16];
}

template ColorRGBA {
 <35FF44E0-6C7C-11cf-8F52-0040333594A3>
 FLOAT red;
 FLOAT green;
 FLOAT blue;
 FLOAT alpha;
}

template ColorRGB {
 <D3E16E81-7835-11cf-8F52-0040333594A3>
 FLOAT red;
 FLOAT green;
 FLOAT blue;
}

template IndexedColor {
 <1630B820-7842-11cf-8F52-0040333594A3>
 DWORD index;
 ColorRGBA indexColor;
}

template Boolean {
 <4885AE61-78E8-11cf-8F52-0040333594A3>
 WORD truefalse;
}

template Boolean2d {
 <4885AE63-78E8-11cf-8F52-0040333594A3>
 Boolean u;
 Boolean v;
}

template MaterialWrap {
 <4885AE60-78E8-11cf-8F52-0040333594A3>
 Boolean u;
 Boolean v;
}

template TextureFilename {
 <A42790E1-7810-11cf-8F52-0040333594A3>
 STRING filename;
}

template Material {
 <3D82AB4D-62DA-11cf-AB39-0020AF71E433>
 ColorRGBA faceColor;
 FLOAT power;
 ColorRGB specularColor;
 ColorRGB emissiveColor;
 [...]
}

template MeshFace {
 <3D82AB5F-62DA-11cf-AB39-0020AF71E433>
 DWORD nFaceVertexIndices;
 array DWORD faceVertexIndices[nFaceVertexIndices];
}

template MeshFaceWraps {
 <4885AE62-78E8-11cf-8F52-0040333594A3>
 DWORD nFaceWrapValues;
 Boolean2d faceWrapValues;
}

template MeshTextureCoords {
 <F6F23F40-7686-11cf-8F52-0040333594A3>
 DWORD nTextureCoords;
 array Coords2d textureCoords[nTextureCoords];
}

template MeshMaterialList {
 <F6F23F42-7686-11cf-8F52-0040333594A3>
 DWORD nMaterials;
 DWORD nFaceIndexes;
 array DWORD faceIndexes[nFaceIndexes];
 [Material]
}

template MeshNormals {
 <F6F23F43-7686-11cf-8F52-0040333594A3>
 DWORD nNormals;
 array Vector normals[nNormals];
 DWORD nFaceNormals;
 array MeshFace faceNormals[nFaceNormals];
}

template MeshVertexColors {
 <1630B821-7842-11cf-8F52-0040333594A3>
 DWORD nVertexColors;
 array IndexedColor vertexColors[nVertexColors];
}

template Mesh {
 <3D82AB44-62DA-11cf-AB39-0020AF71E433>
 DWORD nVertices;
 array Vector vertices[nVertices];
 DWORD nFaces;
 array MeshFace faces[nFaces];
 [...]
}

Header{
1;
0;
1;
}

Mesh {
 3;
 0.67412;0.07989;0.44246;,
 -0.85395;0.03994;-0.46640;,
 -0.44736;1.12202;0.48973;;
 
 1;
 3;0,1,2;;
 
 MeshMaterialList {
  1;
  1;
  0;;
  Material {
   1.000000;1.000000;1.000000;1.000000;;
   0.000000;
   0.000000;0.000000;0.000000;;
   0.000000;0.000000;0.000000;;
  }
 }
}
 

なにやら冗長なフォーマットですね。
これは、データの解釈方法などがテンプレートで定義されているからです。
一般的なデータしか使わないのであればテンプレート無しの方が見やすいです。
では早速テンプレートを除去してみます。

xof 0302txt 0064

Header{
1;
0;
1;
}

Mesh {
 3;
 0.67412;0.07989;0.44246;,
 -0.85395;0.03994;-0.46640;,
 -0.44736;1.12202;0.48973;;
 
 1;
 3;0,1,2;;
 
 MeshMaterialList {
  1;
  1;
  0;;
  Material {
   1.000000;1.000000;1.000000;1.000000;;
   0.000000;
   0.000000;0.000000;0.000000;;
   0.000000;0.000000;0.000000;;
  }
 }
}

随分、短くなって見やすくなりました。
ためしに DirectX SDK に付属のビューワーで開いてみると問題なく
表示されています。
つまり、これもシンプルですがれっきとした .X のファイルです。

 

まず、最初にある xof 0302txt 0064 は X ファイルのテキスト形式ですという
事を示しています。
xof はマジック番号で固定です。
その後にバージョン番号(メジャーとマイナー)の 03 と 02 が続いて
形式タイプの txt が記されています。
形式タイプは txt テキストファイル 、bin バイナリファイル
tzip MSZip 圧縮テキストファイル 、bzip MSZip 圧縮バイナリファイル の4種類があります。
最後の 0064 は浮動小数点サイズです。
0064 は64ビット浮動小数点で 0032 は32ビット浮動小数点です。

マジックコードの後には
Header チャンクがあって、次に Mesh チャンクがあります。
Mesh チャンクの中に MeshMaterialList チャンクがあって、
その中に Material チャンクがあります。

次回の解析編2ではテクスチャ付きの Xファイルを見てみます。

 

最終更新:2011年03月21日 11:46
添付ファイル