座標変換


概要

座標変換とは平行移動や、回転などを駆使して求めたい座標に変換することで、
3D座標のオブジェクトを2D座標に変換し、最終的にスクリーン(ウィンドウ)に
描画するために使われています。
3Dに関する座標の用語が出るので、「ワールド座標」や「ビュー座標」という単語に
聞き覚えがない方はこちらで確認を行ってください。

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

3Dから2Dに変換する場合以下の座標変換が行われます。

変換名 変換前 変換後
ワールド座標変換 ローカル座標 ワールド座標
ビュー座標変換 ワールド座標 ビュー座標
プロジェクション座標変換 ビュー座標 プロジェクション座標
スクリーン座標変換 プロジェクション座標 スクリーン座標
この座標変換は決められた順番があり、その順番通りに実行されます。 gmpg_0007

座標系

各座標変換の説明の前に座標系について説明をします。
3Dの座標系は左手座標系右手座標系があります。

gmpg_0008

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

gmpg_0009

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

ワールド座標変換

ワールド座標変換はローカル座標を持つオブジェクトをワールド座標に配置することをいいます。
ワールド座標は1つだけしかない絶対的な空間です。このワールド座標を指標にして
オブジェクトの表示座標が決まります。

変換方法

ワールド座標変換はまず、拡大回転移動の順番で行列計算を行います。
その結果で出た行列をローカル座標と掛け合わせることで
ワールド座標での表示座標が算出されます。
	
// ワールド座標を求める計算式
ワールド座標 = (拡大行列 * 回転行列 * 移動行列 * ローカル座標);

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

行列計算の注意点

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

gmpg_0010

回転は原点を中心に行われるため、移動で原点からずらしてしまうと
中心からずれてしまうので意図した結果にならなくなります。
ワールド座標変換を行う場合は必ず拡大、回転、移動の順番で計算してください。

ビュー座標変換

ビュー座標変換は3D空間上に設置されたカメラが原点になるように計算を行い、
それに伴う影響(移動や回転)をオブジェクトに反映させることです。
※カメラ座標変換とも呼ばれています。

カメラ情報

ビュー座標変換するためには以下のカメラ情報が必要です。

gmpg_0011

パラメータ 説明
カメラ座標 ワールド座標上のカメラ座標
注視点座標 カメラがどこを向いているのかを明確にするための座標
上方向ベクトル ワールド座標の真上のベクトル
※上方向のベクトルはカメラを原点とした
 座標系を作成するために使用します。

変換の流れ

ビュー座標変換は以下の図のような流れで行われています。

gmpg_0012

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

プロジェクション座標変換ではカメラで写すことができる設定を行い、
クリップ空間と呼ばれる空間を作成します。
このクリップ空間はカメラで写された内容が反映されている空間です。
この空間にオブジェクトが配置されていたら最終的に画面に描画されますが、
逆に配置されていなかったら描画されません。

投影方法

プロジェクション座標変換ではカメラで写す内容を決めるために投影方法を決めます。
投影方法には「平行投影」と「透視投影」があり、3Dゲームでは透視投影が使われています。

投影方法 説明
平行投影 距離に関係なく同じ大きさのままで投影されます。

gmpg_0013
透視投影 近くにあるものは大きく、遠くにあるものは小さく投影されます。

gmpg_0014
以下は透視投影のイメージ図です。 gmpg0015

視錐台

上の図にある視錐台とはカメラで投影される空間(範囲)のことです。

gmpg_0228

この視錐台の中に入っているオブジェクトが画面に描画される対象となります。
以下は視錐台に必要な情報です。

パラメータ 説明
範囲 カメラ座標のZ軸に対する始点と終点の距離を決めます。
始点をnear前方クリップ面、終点をfar後方クリップ面と呼びます。
画角 画角はズームイン、ズームアウトの機能を実行するためのもので、
視野角ともよばれています。

gmpg_0020
アスペクト比 視錐台の縦横の比率で、画面のサイズを使用します。
視錐台の内容はクリップ空間の中に収められ、次のスクリーン描画で使用されます。 クリップ空間の範囲はDirectXの場合(x軸とy軸は-1~1、z軸は0~1)です。 gmpg_0016

スクリーン座標変換

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

gmpg_0019