ポリゴン描画

■必要知識

3Dプログラム理解していた方がいいと思われる内容がいくつかあります。
以下の単語についてあいまいな場合はリンク先の内容を確認して下さい。

	・ローカル座標
	・ワールド座標
	・ビュー(カメラ)座標
	・プロジェクション座標
	・スクリーン座標
	・左手系、右手系
	・ワールド座標変換
	・ビュー座標変換
	・プロジェクション座標変換
	・スクリーン座標変換

		3D座標概要
		座標変換概要

■描画

DirectX9で3Dの描画を行うには2Dの描画と比較して
いくつかの描画のための事前準備をマイフレーム毎に行わなければいけません。
以下のリンクのプロジェクトは三角形ポリゴンを描画しているプロジェクトです。
2Dと3Dの描画でプロジェクトを分けています。

	描画サンプル

上のプロジェクトの2Dと3Dのコードを比較すればわかりますが、
3Dの方が2Dよりも描画直前に行っている手順が増えています。
2Dでは「ポリゴンに指定している座標 = スクリーン座標」となっていますが
3Dのポリゴン座標はあくまでワールド座標上の位置情報です。
このポリゴンをスクリーンに映すためにカメラの位置や内容を設定して
初めて画面に描画されています。

●頂点情報
	3D描画を行う場合の頂点情報には「D3DFVF_XYZRHW」は使用しません。
	「D3DFVF_XYZRHW」はスクリーン座標変換までを自動的にやってくれるための
	情報という認識で現状は問題ありません。
	3Dを描画する場合「D3DFVF_XYZRHW」を使用して勝手に座標変換をされたら困るので
	座標の頂点指定には「D3DFVF_XYZ」を使用します。

	・2D
		#define FVF_3D (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

		typedef struct
		{
			float x, y, z, w;
			DWORD color;
		} VERTEX_2D;
	
	・3D
		#define FVF_3D (D3DFVF_XYZ | D3DFVF_DIFFUSE)

		typedef struct
		{
			float x, y, z;
			DWORD color
		} VERTEX_3D;

	3Dの頂点情報は法線やスペキュラカラーなどの設定もできますが、
	今回のプロジェクトでは必要ないので設定していません。

●カメラ座標設定
	カメラ座標は「D3DXMatrixLookAtLH」という関数で座標変換用の行列を作成し、
	そこでされた関数を「SetTransform」関数で変換行列として設定します。
		
	D3DXMatrixLookAtLH:
		戻り値:
			D3DXMATRIX *:
				演算結果のマトリクスのポインタ
	
		引数:
			CONST D3DXVECTOR3 *pOut:
				演算結果を格納するマトリクスのポインタ
			
			CONST D3DXVECTOR3 *pEye:
				カメラの位置座標のポインタ
			
			CONST D3DXVECTOR3 *pAt:
				注視点の位置座標のポインタ
			
			CONST D3DXVECTOR3 *pUp:
				ワールド座標の上向きのベクトル
		
		内容:
			引数に指定した内容を元にしてビュー座標変換用の行列を作成し、
			第一引数、または戻り値として返す。

	カメラで設定する項目はカメラの座標と、視ている位置を示すための注視点座標、
	ワールド座標の上向きを示すベクトル(0, 1, 0)です。
	この上向きのベクトルは座標変換の計算で必要となる情報ではありますが、
	この値(0, 1, 0)以外を使用することはほぼなく、
	変換の内容を細かく知るまではお決まりの値(0, 1, 0)を
	使用すればいいので、そこまで重要ではありません。

●プロジェクション座標設定
	プロジェクション座標の設定は「D3DXMatrixPerspectiveFovLH」関数を
	使用して行います。
	この関数で作成された行列を「SetTransform」関数に設定します。

	D3DXMatrixPerspectiveFovLH:
		戻り値:
			演算結果のマトリクスのポインタ
		
		引数:
			D3DXMATRIX * pOut:
				演算結果を格納するマトリクスのポインタ
		
			FLOAT fovy:
				画角(ラジアン指定)
		
			FLOAT Aspect:
				アスペクト比
	
			FLOAT zn:
				視錐台の最も近い距離
	
			FLOAT zf:
				視錐台の最も遠い距離
	
		内容:
			引数に指定した内容を元にしてプロジェクション座標変換用の
			行列を作成し、第一引数、または戻り値として返す

	プロジェクションで設定される内容は画角やアスペクト比、
	カメラの見える範囲の設定を行います。

●ワールド座標設定
	ワールド座標を求める方法いくつもありますが、
	最終的に出た結果は行列に格納して「SetTransform」関数を使用して設定を行います。
	ワールド座標行列の割り出しで行う演算は「移動」「回転」「拡縮」です。

	・移動
		D3DXMatrixTranslation
			戻り値:
				演算結果のマトリクスのポインタ
			
			引数:
				FLOAT x:
					X軸への移動値
			
				FLOAT y:
					Y軸への移動値
			
				FLOAT z:
					Z軸への移動値
		
			内容:
				引数に指定した内容を元にして平行移動計算の行列を作成し、
				第一引数、または戻り値として返す。
	・回転
		D3DXMatrixRotationX
		D3DXMatrixRotationY
		D3DXMatrixRotationZ
			戻り値:
				演算結果のマトリクスのポインタ
		
			引数:
				D3DXMATRIX *pOut:
					演算結果のマトリクスのポインタ
		
				FLOAT Angle
					X、Y、Z軸の角度(ラジアン指定)

			内容:
				引数に指定した内容を元にして回転計算の行列を作成し、
				第一引数、または戻り値として返す。
	
	・拡縮
		D3DXMatrixScaling
			戻り値:
				演算結果のマトリクスのポインタ
		
			引数:
				D3DXMATRIX *pOut:
					演算結果のマトリクスのポインタ
		
				FLOAT sx:
					X軸の拡縮値
	
				FLOAT sy:
					Y軸の拡縮値

				FLOAT sz:
					Z軸の拡縮値
	
			内容:
				引数に指定した内容を元にして拡縮計算の行列を作成し、
				第一引数、または戻り値として返す。

	ワールド座標変換で気をつけるべき内容は回転です。
	回転の順番しだいで全く異なる結果になるので、
	回転を行う場合は意識をする必要があります。