3Dモデル
-基本情報-

■概要

3Dモデルは複数のポリゴンが集まってできており、
ゲームで使用される3Dモデルはサーフェスモデルが使用されています。
また、3Dモデルはメッシュとも呼ばれています。
ポリゴンやサーフェスモデルについてはポリゴンの項目に記述がありますので、
そちらを確認して下さい。

■使用データ

	今回は立方体のXファイルBox.xとそのファイルを確認するためのビューワ
	DirectXViewerを使用しますので、以下のリンクからダウンロードして下さい。

		DXViewer

		立方体Xファイル

■3Dモデルパラメータ

3Dモデルに設定されているパラメータは以下のものがあります。
これらのパラメータはXファイルやFBX、OBJファイルなど
いくつもの3Dモデルファイルのフォーマットで使用されている内容で、
各ファイル毎に記述形式が異なりますが、描画に必要な情報として設定されています。

●パラメータ例
	・頂点情報
	・法線情報
	・マテリアル情報
	・UV情報
	・ボーン情報
	・フレーム情報

	上記のパラメータで描画に必要な最低限のデータは頂点情報のみです。

■頂点情報

頂点情報の内容は3Dモデルを形成するための頂点バッファと
インデックスバッファです。

	頂点バッファ:
		ポリゴンを表現するための頂点座標のリスト

	インデックスバッファ:
		インデックスバッファのデータ1つにつき
		ポリゴンが1つ作成される
		データには頂点バッファの配列番号が使用される
		例えばバッファデータの1つが「1、2、3」となっていたら
		頂点バッファの配列1、2、3を使用したポリゴンが作成される

●立方体3Dモデルの頂点情報
	以下は立方体の3Dモデルの頂点情報を抜粋したものです。

		Mesh {
			8;				//① 頂点数
			-1.00000;1.00000;1.00000;,	//② 頂点座標(X,Y,Z)
			1.00000;1.00000;1.00000;,
			1.00000;1.00000;-1.00000;,
			-1.00000;1.00000;-1.00000;,
			1.00000;-1.00000;-1.00000;,
			-1.00000;-1.00000;-1.00000;,
			1.00000;-1.00000;1.00000;,
			-1.00000;-1.00000;1.00000;;
			
			6;				//③ ポリゴン数
			4;0,1,2,3;,			//④ インデックスバッファ情報
			4;3,2,4,5;,
			4;5,4,6,7;,
			4;7,6,1,0;,
			4;1,6,4,2;,
			4;7,0,3,5;;
		}

	頂点設定では頂点バッファとインデックスバッファの設定を行います。
	各設定項目の内容は以下の通りです。
		
	①.頂点数
		モデル形成するための頂点数を指定します。
		今回の立方体では8つの頂点情報が必要なので8
		設定する値は8となります。
			
	②.頂点座標
		①で設定した頂点数1つ1つに頂点座標の設定を行います。
		座標はX軸、Y軸、Z軸の順番で設定します。

	③.ポリゴン数
		1の頂点を作成するポリゴンの数を指定します。
		立方体で必要な面の数は6つなので「6」を指定します。

	④.インデックスバッファ情報
		③のポリゴンの数に対して1つ1つポリゴンの設定を行います。
		設定にはポリゴンに使用する頂点の数と頂点バッファの配列番号を指定します。

	gmpg_0124

■法線情報

法線は頂点上から算出されるベクトルでポリゴンから直行したベクトルです。
このベクトルを利用して陰影処理ポリゴンの表裏判定を行います。
次の項目で説明するマテリアルの設定の一部は法線情報が存在しないと動作しません。

●立方体3Dモデルの法線情報
	以下は立方体の3Dモデルの法線情報を抜粋したものです。
	※Box.xの頂点情報定義の下に以下の内容を追加して下さい。
	
		MeshNormals {
			// ①.法線の数
			6;
			// ②.法線ベクトル(XYZ)
			0.000000;1.000000;0.000000;,
			0.000000;0.000000;-1.000000;,
			0.000000;-1.000000;-0.000000;,
			0.000000;0.000000;1.000000;,
			1.000000;0.000000;0.000000;,
			-1.000000;0.000000;0.000000;;
			// ③.ポリゴンの数
			6;
			// ④.各頂点に使用する法線
			4;0,0,0,0;,
			4;1,1,1,1;,
			4;2,2,2,2;,
			4;3,3,3,3;,
			4;4,4,4,4;,
			4;5,5,5,5;;
		}

	法線情報は法線の定義と、定義した法線を
	各ポリゴンの頂点1つ1つに設定します。
	内容は以下の通りです。

	①.法線の数
		定義する法線ベクトルの数を指定します。

	②.法線ベクトル(XYZ)
		法線ベクトルの指定をします。

	③.ポリゴンの数
		法線を適用するポリゴンの数を指定します。
		このポリゴンの数は頂点情報で指定している
		インデックスバッファの数が使用されます。

	④.各頂点に使用する法線
		ポリゴンの頂点1つ1つに対して法線ベクトルの
		指定を行う必要があるので、まずポリゴンの数を指定して、
		法線ベクトルの番号を指定します。

	gmpg_0125

●法線の確認のしかた
	DirectXViewerには法線視覚化できるをオプション機能があるので、
	それを利用して法線を見てみたいと思います。

	方法:
		DirectX Viewerの下部にある「View」をクリックする
		複数のチェックボックスが表示されるので、
		「Normals」にチェックを入れる

■マテリアル情報

マテリアルとはポリゴンに色を付けるために必要な情報のことです。
このマテリアルを使用することにより、色や光沢、材質感を表現することができます。

●マテリアル情報
	マテリアル情報には「アンビエント」や「ディフューズ」「エミッシブ」などがあり、
	ファイルのフォーマットにより設定できる項目が異なります。
	共通しているのは「ディフューズ」「エミッシブ」「スペキュラー」「反射」辺りです。

	ディフューズ:
		ディフューズは拡散光と呼ばれており、ライトなどによる光の当たり方による
		反射する色を設定することができます。
		このディフーズを利用することで光の当たり方による陰影を表現することが可能です。
		ただ、ディフューズの色の決定は法線ベクトルと光のベクトルを利用した計算で
		算出されるので、ディフューズを利用するためには法線情報が必須となります。

	エミッシブ:
		エミッシブは「放射光」と呼ばれており、そのマテリアル自体が発している色です。
		このエミッシブは外からの光の当たり方は関係なく、法線の設定やライトがなくても、
		設定した色情報が表現されます。

	スペキュラー:
		スペキュラーは「鏡面光」と呼ばれており、ライトなどの光を反射した
		金属などの輝きを表現できます。
		この反射の度合いが強いほど強く反射し、度合いが低いほど弱く反射します。
		スペキュラーも法線情報は必須です。

	反射:
		スペキュラーの反射の度合いを設定します。
		この値が大きいほどスペキュラーは強い反射を表現でき、
		値が小さいほど弱い反射を表現できます。

●立方体3Dモデルのマテリアル情報
	以下は立方体の3Dモデルのマテリアル情報を抜粋したものです。
	※Box.xの法線情報定義の下に以下の内容を追加して下さい。

		MeshMaterialList {
			1;		// ①.マテリアルの数
			6;		// ②.ポリゴンの数
			0,		// ③.ポリゴンに使用するマテリアル番号
			0,
			0,
			0,
			0,
			0;;
			// ④.マテリアル定義
			Material {
				// 4-1.ディフューズカラーRGBA
				0.000000;1.000000;0.000000;1.000000;;
				// 4-2.スペキュラーの強度
				0.000000;
				// 4-3.スペキュラーカラーRGB
				0.000000;0.000000;0.000000;;
				// 4-4.エミッシブカラーRGB
				0.000000;0.000000;0.000000;;
			}
		}

	
	マテリアル情報はマテリアルの定義と、定義したマテリアルを
	各ポリゴンの1つ1つに設定します。
	内容は以下の通りです。
		
	①.マテリアルの数
		定義しているマテリアルの数を指定します。

	②.ポリゴンの数
		マテリアルを設定するポリゴンの数を指定します。
		この数値にはインデックスバッファの数が使用されます。

	③.ポリゴンに使用するマテリアル番号
		②のポリゴン1つ1つに定義したマテリアルの番号を
		指定していきます。
		マテリアルの定義番号は「0」番から始まります。

	④.マテリアル定義
		ディフューズカラーなどの設定を行います。
		マテリアルの定義はマテリアルの数の設定の前に行っても
		問題ありません。

		4-1.ディフューズカラー
			ディフューズカラーの設定をRBGAの順番で行います。

		4-2.スペキュラー強度
			スペキュラーカラーの設定を行います。
			値の型はfloat型です。

		4-3.スペキュラーカラー
			スペキュラーカラーの設定をRBGの順番で行います。

		4-4.エミッシブカラー
			エミッシブカラーの設定をRBGの順番で行います。

		gmpg_0126

●変更
	Box.xの色情報を変えてその変化を見たいと思います。

	①.ディフューズカラーの変更
		Box.xのMaterialのディフューズカラーの色を
		赤(1.0, 0.0, 0.0, 1.0)に変更して
		Boxの色が変わるのを確認して下さい。
			
		Material {
			0.000000;0.000000;1.000000;1.000000;;
			0.000000;
			0.000000;0.000000;0.000000;;
			0.000000;0.000000;0.000000;;
		}

	②.エミッシブカラーの変更
		エミッシブカラーの色を青(0.0, 0.0, 1.0)に変更して
		色の変化を確認して下さい。

		Material {
			1.000000;1.000000;1.000000;1.000000;;
			0.000000;
			0.000000;0.000000;0.000000;;
			0.000000;0.000000;1.000000;;
		}

■UV情報

UV情報はマテリアルに設定されているテクスチャのUVに関する情報です。
UVの数は頂点バッファの数だけ用意されます。
この情報を利用してモデルにテクスチャが展開されます。

●ファイル情報
	Xファイルのテクスチャはマテリアルに付与します。

	Material {
		0.800000;0.800000;0.800000;1.000000;;
		5.000000;
		0.000000;0.000000;0.000000;;
		0.000000;0.000000;0.000000;;
		// 使用するテクスチャの名前
		TextureFilename {
			"bomb.png";
		}
	}

●立方体3DモデルのUV情報
	UV情報展開のモデルは先ほどのBoxでは少々問題がありますので、
	以下のファイルをダウンロードして下さい。

	立方体Xファイル(UV設定済み)
	テクスチャ

	MeshTextureCoords {
		// ①.展開するUVの数
		20;
		// ②.UV座標
		0.000000;0.000000;,
		1.000000;0.000000;,
		1.000000;1.000000;,
		0.000000;1.000000;,
		0.000000;0.000000;,
		1.000000;0.000000;,
		1.000000;1.000000;,
		0.000000;1.000000;,
		0.000000;0.000000;,
		1.000000;0.000000;,
		1.000000;1.000000;,
		0.000000;1.000000;,
		0.000000;0.000000;,
		1.000000;0.000000;,
		1.000000;1.000000;,
		0.000000;1.000000;,
		1.000000;1.000000;,
		0.000000;1.000000;,
		0.000000;0.000000;,
		1.000000;0.000000;;
	}

	UV情報は頂点1つ1つに対して設定を行います。
	内容は以下の通りです。

	①.展開するUVの数
		指定するUVの数です。
		この数は頂点バッファの頂点数と同じ数になります。

	②.UV座標
		展開するUV座標で左からU値、V値となります。
		ここで指定した値は頂点バッファの上から順番に設定されていきます。
		例えば最初のUV座標は頂点バッファの0番目、2番目のUV座標は
		頂点バッファの1番目に設定されます。

		gmpg_0127

●UV展開の問題点
	なぜ最初のXファイルではUV情報の説明を行うのに問題があったかというと
	頂点数が少ないと設定できるUV情報も少なくなるために
	こちらが表現したい設定ができない可能性があります。

	gmpg_0128
		
	上の図でも書いていますが、立方体の頂点数は最大24で、
	最初にダウンロードしてもらったBox.xの頂点数は8でした。
	UV指定は頂点の数しか行うことができないので8つの頂点で、
	立方体全ての面に図のようなテクスチャを貼り付けることは不可能です。
	きちんとしたUV展開を行うために頂点数を増やして、
	設定できるUV数を増やす必要があります。