座標変換

■座標系

3Dの座標系は左手座標系右手座標系があります。
gmpg_0008
上の図のように左手はZ軸が奥方向、右手系は手前方向になっています。
ゲームライブラリでいうとDirectXは左手系、OpenGLは右手系になります。
この座標系の違いで一番大きいのは回転方向だと思います。
左手系は時計回り、右手系は反時計回りに回転します。

gmpg_0009
もし、回転の向きを忘れた場合は親指を立てた状態で手を開いてください。
そして親指はそのままで手を閉じてください。
その時の閉じる方向が左手系、右手系の回転方向です。
左だと時計、右だと半時計に手が閉じられていくと思います。

■座標変換

座標変換とは平行移動や、回転などを駆使して求めたい座標に変換することです。
座標変換には行列を多用します。
3D座標を2D座標に変換するにはワールド座標変換やカメラ座標変換を順番に
行うことでスクリーン(ウィンドウ)に表示しています。

■3Dから2Dへの座標変換の流れ

3Dから2Dに変更し、スクリーンに表示するまでの流れは次のようになっております。

	gmpg_0007

■ワールド座標変換

ワールド座標変換はローカル座標を持つオブジェクトをワールド座標に配置することをいいます。
ワールド座標は1つだけしかない絶対的な空間です。このワールド座標を指標にして
オブジェクトの表示座標が決まります。
	
●変換方法
	ワールド座標変換はまず、拡大回転移動の順番で行列計算を行います。
	その結果で出た行列をローカル座標と掛け合わせることで
	ワールド座標での表示座標が算出されます。
	
	ワールド座標を求める計算式:
		ワールド座標 = (拡大行列 * 回転行列 * 移動行列 * ローカル座標);

	※ローカル座標と書いていますがこれはオブジェクトが持つポリゴン座標
	 一つ一つに対して行われます。

●行列計算の注意点
	変換方法で拡大、回転、移動の順番で書いていますが、この順番は必ず守る必要があります。
	守らなかった場合、自分が意図していない場所にオブジェクトが表示されることになります。
	下の図は正しい順番と順番を間違ったワールド座標計算を行った結果です。

	gmpg_0010
	
	このように正しい順番で行わないと位置がずれて表示されます。
	回転は原点を中心に行われます。移動などを先に行い原点からずれてしまうと
	ずれた座標で回転が行われてしまいます。

	ワールド座標変換を行う場合は必ず拡大、回転、移動の順番で計算を行ってください。

■ビュー座標変換

カメラ座標変換は3D空間上に設置されたカメラが原点になるように計算を行い、
それに伴う影響(移動や回転)をオブジェクトに反映させることです。
●カメラ情報
	変換には以下のカメラ情報が必要です。
	gmpg_0011
	カメラ座標:
		カメラの位置座標
		
	注視点座標:
		カメラがどこを見ているのかを明確にするための座標
	
	カメラの上方向のベクトル:
		カメラの上方向のベクトル(ワールド座標でのベクトル)

	上方向のベクトルはカメラを原点とした座標系を作成するために使用します。

●変換の流れ
	カメラ座標変換は以下の図のような流れで行われています。

	gmpg_0012

■プロジェクション座標変換

プロジェクション座標変換ではカメラの設定を行い、クリップ空間と呼ばれる空間を作成します。

●投影方法
	平行投影:
		平行投影は距離に関係なく同じ大きさのままで投影されます。
		gmpg_0013
	
	透視投影:
		透視投影は近くにあるものは大きく、遠くにあるものは小さく投影されます。
		gmpg_0014
	
	以下は透視投影のイメージ図になります。
		gmpg0015
		
	視錐台は投影される範囲です。
	視錐台の範囲に入っているオブジェクトが画面に描画される対象となります。

●投影に必要な情報
	範囲:
		始まりと終わりの距離を決めます。
		始まりをnear前方クリップ面、終わりをfar後方クリップ面と呼びます。

	画角:
		画角はズームイン、ズームアウトの機能を実行するためのもので、
		視野角ともよばれています。
		
		gmpg_0020
	
	アスペクト比:
		画面の縦横の比率です。
		画面のサイズはウィンドウのサイズを使用します。

視錐台の内容はクリップ空間の中に収められ次のスクリーン描画で使用されます。
クリップ空間の範囲は(x軸とy軸は-1~1、z軸は0~1)※DirectXの場合
gmpg_0016

■スクリーン座標変換

スクリーン座標変換はプロジェクション座標変換の結果を
スクリーン(ウィンドウ)に反映します。
	gmpg_0019