投影行列

projection-matrix.png

カメラ座標系クリップ座標系正規化デバイス座標までの変換をいっきにやってくれる変換である。
一般に投影という用語は、次元を減らす操作を指します。
投影を実現する一つの方法は、ある向きに倍率0のスケーリングを行うことです。
投影行列は射影作用素の一種である

基本平面への投影

最も簡単な方法は次元の一つを単純に破棄すること。
例えば、3Dオブジェクトの点のz成分を破棄して、xとyだけをコピーすることにより、3Dオブジェクトを2Dオブジェクトにできます。
しかしながら、基本平面への投影は、垂直軸上で倍率0を使ってスケーリングすることによっても可能です。
(1)
\begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&0 \end{bmatrix}

任意の平面の投影する3D行列

注意この式は平行移動を考慮していないので、
投影する平面は原点を通っている必要がある
nは平面や直線に垂直な単位ベクトル(法線ベクトル)

理論

投影する向きに倍率0を適用することにより、任意の向きへ投影する行列を導出できる。

数式
(4)
\begin{align} P(n)=S(n,0)\\ = \left[ \begin{array}{cc} 1+(0-1)n_x^2 & (0-1)n_xn_y & (0-1)n_xn_z & 0 \\ (0-1)n_xn_y & 1+(0-1)n_y^2 & (0-1)n_yn_z & 0 \\ (0-1)n_xn_z & (0-1)n_yn_z & 1+(0-1)n_z^2 & 0 \\ 0 & 0 & 0 & 1\\ \end{array} \right]\\ = \left[ \begin{array}{cc} 1-n_x^2 & -n_xn_y & -n_xn_z & 0 \\ -n_xn_y & 1+-n_y^2 & -n_yn_z & 0 \\ -n_xn_z & -n_yn_z & 1-1n_z^2 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array} \right] \end{align}

OpenGLでの投影プロセス

カメラ座標からクリップ座標になるとき、
基本的にnear平面に投影されると考える
gl_projectionmatrix03.png gl_projectionmatrix04.png

投影後のz

カメラ座標におけるZ_eは、常に-nになる
投影したらzはつぶれるのでなんの意味が??
デプステストやクリッピングテストのためにzの値はそれっぽいのが必要だ。
投影後のzはx,y,に依存しない値なのでまず行列の第3行目成分は(0,0,*,*)であることは決定である。
カメラ座標z=-nearのとき、正規化デバイス座標ではz=-1になる。
カメラ座標z=-farのとき、正規化デバイス座標ではz=1になる。

参考にした本


projected-size projection

サポートサイト Wikidot.com projected-sizeprojection