3DCGでの座標変換の流れ
座標変換
3DCGでの座標変換は、
ローカル座標 → ワールド座標 → ビュー座標 → パースペクティブ座標 → デバイス座標、
と座標変換を行い、三次元空間の形状を2Dのスクリーンに投影します。
Shade3Dでは、スクリプトやプラグインを作成する場合に座標変換がよく使用されます。
Shade3Dの座標系は「右手系」になります。
ローカル座標
ローカル座標は、形状を中心とした座標系です。
1つの形状、パート、ジョイントは1つのローカル座標を持ちます。
Shade3Dの内部では、この座標系は「4×4の変換行列」で管理されます。
形状を選択したときの形状情報ウィンドウの「パート属性」が、ローカルの変換行列になります。
1つの変換行列は、移動/回転/せん断/スケールの要素を持ちます。
球や円、自由曲面、パート、ジョイントなどそれぞれの形状が変換行列を持ちます。
Shade3Dでは、「ポリゴンメッシュ」については変換行列が常に「単位行列」になります(移動/回転/せん断/スケール要素が常に初期値)。
ワールド座標
ワールド座標は、シーンを表す座標系です。グローバル座標とも呼ばれます。
ローカル座標にある形状を、ワールド座標上に平行移動/回転/拡大縮小して位置を変えます。
シーン上の形状は階層構造で管理されています。
形状をローカル座標からワールド座標に変換する場合、それぞれの変換行列を累積することになります。
上図の「球2」をワールド座標に変換する場合、
[球2]の変換行列 x [パートB]の変換行列 x [パートA]の変換行列 x [ルートパート]の変換行列
の計算を行うことになります。
ビュー座標
ワールド座標をカメラを中心とした座標系に変換します。
このときの座標系を「ビュー座標」と呼びます。
カメラの正面が-Z軸(右手系の場合)を向くように平行移動/回転させる変換を行います。
1つのカメラは、1つのビュー座標変換行列を持ちます。
パースペクティブ座標
カメラの視野角度(Shade3Dの「焦点距離」から計算される)やスクリーンサイズ(縦と横のサイズから計算されるアスペクト比)、
内部的なZ方向の近クリップまでの距離/遠クリップまでの距離を元に、
透視投影の変換を行います。
1つの4×4変換行列で変換されます。
これは、今までのローカル→ワールド→ビュー変換とは異なり、平行移動/回転/せん断/拡大縮小を行いません。
3D座標系から2D座標系への、投影変換に相当する計算が行われます。
ここで計算されたZ値は、最終的なデバイス座標(スクリーンで見た最終的な座標系)に変換してくる工程では使用されないことになりますが、
パースペクティブ座標で計算されたZ値は、
陰面消去、デプスバッファの保持やポストエフェクトなどで使用できる要素となります。
デバイス座標
最終的なスクリーン(ディスプレイに表示するピクセル位置)に合わせた変換になります。
解像度に合わせた変換を行います。
下画像では、右の透視図でビュー変換 → パースペクティブ変換 → デバイス変換した最終的なビューが表示されています。
アフィン変換
ローカル座標での「平行移動」「回転」「拡大縮小」「せん断」、
「ローカル座標 → ワールド座標」「ワールド座標 → ビュー座標」の変換については、
可逆の変換になります。
また、それぞれの変換を累積し、1つの行列にまとめることができます。
また、それぞれを分解することができます。
このような特徴を持つ変換を「アフィン変換」と呼びます。
「ビュー座標→パースペクティブ座標」変換については、行列をまとめることはできません。
この場合は、透視投影(Perspective)変換になります。