このページでは座標系の変換について記載していきます。
基本的に座標系の変換は行列による計算で行われています。
その為、3Dのゲームを作るには行列の計算について最低限の事は理解する必要があります。
今回の座標変換の中で最低限の必要な知識を紹介していきます。
ローカル座標系からワールド座標系に変換
ローカル座標からワールド座標に変換するには主に3つの計算で行われます。
内容は拡大縮小・回転・移動の3つです。
行列の計算は意外と簡単になっています。
ローカル座標と行列を掛け合わせるだけでワールド座標に変換することができます。
ただし、注意点が一つあります。
普通の掛け算は掛ける順番によって結果は変わりませんが、行列は掛け合わせる順番に依存するのです。
なので今回の場合は下記の順番で掛けることになります。
ワールド座標変換の計算
ワールド座標 = ローカル座標 * 拡縮行列 * 回転行列 * 移動行列
ローカル座標→拡大→回転→移動
それぞれ座標の計算の順番を変えた場合はどういった結果になるか見てみましょう。
ローカル座標→拡大→移動→回転(NG例)
元々あるはずの位置から下にズレました。
これは移動してから回転したことで移動した座標も一緒に回転したからです。
このように行列の掛け合わせる順番は気を付けなくてはいけません。
ワールド座標系からビュー座標系に変換する
ビュー座標系への変換はカメラを原点とした座標にする行列を使って変換します。
カメラの原点に移動した上でカメラの向きに合わせて回転することで実現してます。
ワールド座標系→ビュー座標系
→
DirectXではいくつかの情報からビュー変換行列を作成する関数が用意されています。
ビュー座標系からプロジェクション座標系に変換する
プロジェクション座標系ではNearクリップとFarクリップに挟まれた視錐台と呼ばれる範囲を-1~1の値に納められるように変換します。
この-1~1の範囲から外に出た部分は描画前に弾かれるようになっています。
描画をクリップする空間なのでクリップ空間と呼ばれたりもします。
クリップ空間とはNearとFarの間が視錐台です。
プロジェクション座標系からスクリーン座標系に変換する
プロジェクション座標系で-1~1に納められるようにしていますが、表示先は解像度等に合わせて異なるサイズです。
ここではビューポート(表示範囲)の設定に合わせてスケーリングします。
スクリーン座標系までくれば2D描画と同じになるので実際に絵を描画することができます。
今回は実際のコードは載せていませんが、重要な内容になるので3Dのプログラムをする上で必須になります。
※余談ですが今回の記事は全て3Dで記事の処理を実装してキャプチャーした画像をしています。