投影変換(projection)
三次元CGと云えど,表示先は二次元スクリーン...
三次元ワールド座標 → 二次元スクリーン座標の変換.
投影は合成変換の最終段1回だけなので必要性は薄いが,
行列に一体化できれば,より効率的.
- 投影の効果説明図(PDF)
- 投影の設定の一例:
- カメラ位置:\( \Coord{0, 0, +e} \)
- スクリーン:\( xy \)平面,\( z' = 0 \)
- 投影方向:\( -z \)軸
この設定の場合には,下記のような投影結果(変換後の位置ベクトル)となります.
(別の設定では,当然,異なる結果に.)
- 平行投影(parallel proj...),垂直投影(orthographic ...):
\[ \Mat{x' \\ y' \\ z'} = \Mat{x \\ y \\ \color{red}0} \]
変換行列もスケーリングを元にして,次のように表せます.
\[ P_\mathrm{para} = \Mat{
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & \color{red}{0} & 0 \\
0 & 0 & 0 & 1
} \]
- 透視投影(perspective proj...),中心投影(central ...):
\[ \Mat{x' \\ y' \\ z'} = {\color{red}\F{e}{e - z}} \Mat{x \\ y \\ 0} \]
係数の分母の \( z \) の存在に注意.
こんなの変換行列(一次式)にできるのかい?
同次座標を利用し,
W 成分に \( z \) が現れるように,
平行投影の変換行列の4行目を適切に整えれば,できます.
\[ P_\mathrm{pers} = \Mat{
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 \\
0 & 0 & \color{red}-1/e & 1
} \]
別の設定では,当然,異なる行列に.
ここでは簡易的に,モデル座標系 → スクリーン座標系の変換でした.
より実際的な3D-CGでは,カメラの位置・視野の設定を反映するため,
途中にビュー座標系との間の変換も必要ですよ.