Home | Lesson | Game | Tool | Link

B03.Xファイル表示

Xファイルの表示方法と、フォーマットの解説をします。
また、鬼門となっているTiger.xの表示方法を紹介します。


ノード作成
cubeとtigerノードを作成します。
重ならないようにそれぞれずらして配置しておきます。
	//ノードの作成
	IAnimatedMesh* mesh1 = smgr->getMesh("cube.x");
	IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode(mesh1);
	node1->setPosition(vector3df(-2,0,0));

	IAnimatedMesh* mesh2 = smgr->getMesh("tiger.x");
	IAnimatedMeshSceneNode* node2 = smgr->addAnimatedMeshSceneNode(mesh2);
	node2->setPosition(vector3df(2,0,0));


表示
回転させながら表示させます。
	f32 r = 0.0f;

	while(device->run())
	{
		driver->beginScene(true,true,0xFF6060FF);

		//図形作成
		node1->setRotation(vector3df(r,r,0));
		node2->setRotation(vector3df(r,r,0));
		r += 0.01f;

		//シーンの描画
		smgr->drawAll();

		driver->endScene();
	}


Xファイルフォーマット
Xファイルフォーマットを簡単に紹介します。

予約語
次の単語は予約されているので、名前として使用できません。
ARRAYBINARYBINARY_RESOURCECHAR
CSTRINGDOUBLEDWORDFLOAT
SDWORDSTRINGSWORDTEMPLATE
UCHARULONGLONGUNICODEWORD
ヘッダー ヘッダーは必須で、必ず先頭に記述してください。
タイプサイズ説明
マジック番号[必須]4xof
バージョン番号[必須]203メジャーバージョン
03マイナーバージョン
形式タイプ[必須]4txtテキストファイル
binバイナリファイル
tzipMSZip 圧縮テキストファイル
bzipMSZip 圧縮バイナリファイル
浮動小数点サイズ[必須]4006464ビット浮動小数点
003232ビット浮動小数点
例) xof 0303txt 0064 コメント コメントはテキストファイルでのみ有効です。 [//]か[#]以降が無視されます。 #This is a comment. //This is a comment. テンプレート テンプレートによって、データの解釈方法が定義されます。 つまり、テンプレートの定義によってデータが調整されます。 テンプレートの形式は以下のようになっています。
template 
{
	<UUID>		//固定の識別子
	<member 1>;	//データメンバ1
	...
	<member n>;	//データメンバn
	[restrictions]	//限定
}
テンプレート名には、英数字とアンダースコア(_)を使用可能です。 ただし、先頭の文字に数字は使えません。 UUID は、Open Software Foundation の分散コンピューティング環境標準の書式に従う Universally Unique Identifierであり、山型かっこ (< >) で囲みます。 基本的なテンプレートは固定のIDを持っていると思ってください。 テキストファイル形式のXファイルを開いた際に、データ型が記述されてありますが、 それがテンプレートになります。 使用可能なデータ型
サイズ
WORD16ビット
DWORD32ビット
FLOATIEEE浮動小数点
DOUBLE64ビット
CHAR8ビット
UCHAR8ビット
BYTE8ビット
STRINGNULL終端文字列
CSTRINGフォーマットされたC文字列(未サポート)
UNICODEUnicode文字列(未サポート)
追加のデータ型もテンプレート内でデータの前に事前に定義されていれば テンプレート内で参照できます。ただし、前方参照はできません。 また、有効なデータ型は配列としても表現可能です。 配列として記述する場合は、以下のように記述します。
array <data-type> <name>[<dimension-size>];
テンプレートの限定使用 テンプレートは。開くか閉じることができ、限定使用も可能です。 言い換えると、以下のような感じです。 開いたテンプレート :用意されている型以外にもデータを追加可能です。            テンプレートの最後に[ ... ]を追加します。            (何でも追加可能という意味です。) 閉じたテンプレート :用意されている型しか使用できません。            何も記述されていない場合は、閉じたテンプレートです。 限定したテンプレート:指定された型だけ追加可能です。            テンプレートの最後に追加してもよい型を記述します。            [{data-type <UUID>}, ...] テンプレートの例 以下にテンプレートの例を記述します。
template Mesh
{
	<3D82AB44-62DA-11cf-AB39-0020AF71E433>
	DWORD nVertices;
	array Vector vertices[nVertices];
	DWORD nFaces;
	array MeshFace faces[nFaces];
	[ ... ]				//開かれたテンプレート
}

template Vector
{
	<3D82AB5E-62DA-11cf-AB39-0020AF71E433>
	FLOAT x;
	FLOAT y;
	FLOAT z;
}					//閉じたテンプレート

template FileSystem
{
	<UUID>
	STRING name;
	[ Directory <UUID>, File <UUID> ]	//制限されたテンプレート
}


Xファイルサンプル
xof 0303txt 0064

//ヘッダー
Header
{
	3;
	3;
	1;
}

//マテリアルの定義
Material  RedMaterial
{
	//面のカラーRGBA
	1.000000;0.000000;0.000000;1.000000;;
	//スペキュラ色指数
	0.000000;
	//スペキュラ色RGB
	0.000000;0.000000;0.000000;;
	//エミッション色RGB
	0.000000;0.000000;0.000000;;
}
Material  GreenMaterial
{
	//面のカラーRGBA
	0.000000;1.000000;0.000000;1.000000;;
	//スペキュラ色指数
	0.000000;
	//スペキュラ色RGB
	0.000000;0.000000;0.000000;;
	//エミッション色RGB
	0.000000;0.000000;0.000000;;
}

//メッシュの定義
Mesh CubeMesh
{
	//頂点数
	8;
	//頂点配列(XYZ)
	 1.000000; 1.000000;-1.000000;,
	-1.000000; 1.000000;-1.000000;,
	-1.000000; 1.000000; 1.000000;,
	 1.000000; 1.000000; 1.000000;,
	 1.000000;-1.000000;-1.000000;,
	-1.000000;-1.000000;-1.000000;,
	-1.000000;-1.000000; 1.000000;,
	 1.000000;-1.000000; 1.000000;;

	//面数
	12;
	//インデックスリスト(頂点数,頂点)
	3;0,1,2;,
	3;0,2,3;,
	3;0,4,5;,
	3;0,5,1;,
	3;1,5,6;,
	3;1,6,2;,
	3;2,6,7;,
	3;2,7,3;,
	3;3,7,4;,
	3;3,4,0;,
	3;4,7,6;,
	3;4,6,5;;

	//マテリアルリスト
	MeshMaterialList
	{
		//マテリアル数
		2;
		//面数
		12;
		//対応マテリアル番号
		0,
		0,
		0,
		0,
		0,
		0,
		0,
		0,
		1,
		1,
		1,
		1;;

		//マテリアル(参照呼出し)
		{RedMaterial}
		{GreenMaterial}
	}
}



Xファイル作成時の注意点
Xファイルには、「#」「//」をつけてコメントを記述可能です。
DirectXではどこにコメントを記述しても問題ありませんが、
Irrlichtで使用する場合は、データの後ろにコメントを記述するとエラーになります。
これは、Irrlichtの読み取りバグです。
コメントを記述する場合は、専用に1行使用して記述しましょう。


Meetasequia(LE)で作成したXファイルの表示
以下のようになっていると、そのままでは表示できません。
Header{
1;
0;
1;
}

次のように"{"の位置を移動すると問題なく表示されます。
Header
{
1;
0;
1;
}

これは、Irrlichtの読み取りバグです。
削除しても表示されますが、それはHeaderの検索でNULLになって無視されていたからと思われます。


DirectXSDK付属のtiger.xについて
Irrlichtではtiger.xを表示できません。これには、問題箇所が2箇所存在します。

1.Headerを修正していない
 Irrlichtの読み取りバグです。
 「Meetasequia(LE)で作成したXファイルの表示」を参照してHeaderを修正してください2.マテリアルを設定していない
 最初の面にしかマテリアルが設定されていません。
 Irrlichtでは、存在する面全てに設定する必要があります。
 tiger.xでは、面が599個定義されているので、残り598個追加しましょう。

以上、2箇所を修正することで、問題なく表示可能です。

ダウンロード
今回作成したファイル一式です。修正したTiger.xも同梱してあります。

宿題
1.板ポリゴンだけのXファイルを作成してみましょう。
2.作成したポリゴンの上にtigerを表示してみましょう。