正投影行列

orthogonal-projection.png

正投影では投影線1が平行である。
平行投影変換ともいう。
原点=視点であるカメラ座標系からクリップ座標系に変える役割を持つ。

glOrtho(left,right,bottom,top,near,far)

l=left,r=right,b=bottom,t=top,n=nea,f=far
ここで渡す値は、カメラ座標系での値を渡す。
ただしnear,farだけはzの正負が逆になってるので要注意。

(1)
\begin{align} \left[ \begin{array}{cc} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1\\ \end{array} \right] \end{align}

正投影行列の1行目の意味

x 軸方向について, 視野空間の中心が原点となるように
$\frac{-(r+ l)}{r-l}$ だけ平行移動し,
その大きさを $\frac{2}{(r-l)}$ 倍します.
y, z 軸についても同様に考えれば, 次の変換行列が得られます.

左右対称な正投影の場合

もし、正投影行列が左右対称なら(大抵の場合、左右対称だよね?)
r=-l,t=-bであるので、

  • r+l=0
  • r-l=2r

となり行列はもっと簡略化できる。

(2)
\begin{align} \left[ \begin{array}{cc} \frac{2}{2r} & 0 & 0 & -\frac{0}{2r} \\ 0 & \frac{2}{2t} & 0 & -\frac{0}{2t} \\ 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1\\ \end{array} \right] = \left[ \begin{array}{cc} \frac{1}{r} & 0 & 0 & 0 \\ 0 & \frac{1}{t} & 0 & 0 \\ 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1\\ \end{array} \right] \end{align}

意味

x成分を見ると、その大きさを $\frac{1}{right}$ 倍します.
つまり、画面内に入っているxの端っこの最大は1になるってことだ。

正投影行列の分析

このように考える。

(3)
\begin{align} \left[ \begin{array}{cc} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{-2}{f-n} & 0 \\ 0 & 0 & 0 & 1\\ \end{array} \right]\left[ \begin{array}{cc} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{f+n}{2} \\ 0 & 0 & 0 & 1\\ \end{array} \right] \end{align}

右側の行列:原点をカメラからビューイングボリュームに平行移動

まず、視点=原点だったのから、原点をビューイングボリュームの中心に移動すべく平行移動をしている。
右側の行列の$\frac{r+l}{2},\frac{t+b}{2},\frac{f+n}{2}$はただの平行移動である。r+l=t+b=0ならx,y軸方向に何も移動しなくていいのである。
移動するのはz方向だけ。near=2.0,far=8.0の場合10/2=5…だけz軸方向に移動したことになる。

左側の行列:スケール合わせ

左側の行列はスケールを変えているのである。
スケールを、横がright-left,縦がtop-bottomだったのを、±1.0にするために割っている。

注意

x軸について、ビューイングボリュームが、原点の

(4)
\begin{align} l \neq r,t \neq b ,n \neq f \end{align}

でなければらない。

gluOrtho2D(left,right,bottom,top)

 gluOrtho2D(-1.0, 1.0, -1.0, 1.0)

に左下が(-1.0,-1.0)、右上が (1.0,1.0)の座標系になる。
いわゆる正規化デバイス座標
near=-1.
far=1
になる。
glmのortho関数でも同様の仕様
Bibliography

opengl-2d-template

サポートサイト Wikidot.com opengl-2d-template