glFrustumとgluPerspective

OpenGLの透視投影の指定はhttp://www.opengl.org/sdk/docs/man/xhtml/glFrustum.xml (glFrustum)で行う。

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

もうひとつこれの簡易版としてhttp://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml (gluPerspective)があって

gluPerspective(fovy, aspect, near, far)

となっている。
(fovyは「Field Of View. Yの」くらいの意味。)


glFrustumの行列は、

\left( \begin{array}{cccc} \frac{2 \cdot near}{right - left}  & 0 & A & 0 \\  0 & \frac{2 \cdot near}{top - bottom} & B & 0 \\  0 & 0 &  C & D \\  0 & 0 & -1 & 0 \end{array} \right) \\ A = \frac{right + left}{right - left} \\ B = \frac{top + bottom}{top - bottom} \\ C = - \frac{far + near}{far - near} \\ D = - \frac{2 \cdot far \cdot near}{far - near}

のように定義される。
このうちAとBはgluPerspectiveでは常に0になる。
左右対称(left+right=0)かつ上下対称(top+bottom=0)だからです。

これを代入すると
\left( \begin{array}{cccc} \frac{2 \cdot near}{right - left}  & 0 & 0 & 0 \\  0 & \frac{2 \cdot near}{top - bottom} & 0 & 0 \\  0 & 0 & - \frac{far + near}{far - near} & - \frac{2 \cdot far \cdot near}{far - near} \\  0 & 0 & -1 & 0 \end{array} \right)

となる。
一方、gluPerspectiveの行列は、

\left( \begin{array}{cccc} \frac{f}{aspect}  & 0 & 0 & 0 \\  0 & f & 0 & 0 \\  0 & 0 & \frac{far + near}{near - far} & \frac{2 \cdot far \cdot near}{near - far} \\  0 & 0 & -1 & 0 \end{array} \right) \\ f = \cot \left( \frac{fovy}{2} \right)

と定義される。
gluPerspectiveのfに対応するglFrustumの

\frac{2 \cdot near}{top - bottom} \\ \frac{near}{ height/2 } = \frac{\cos}{\sin}

とするとcotangentの定義そのまま。
もう1つのf/aspectの方もそういうことで2式は等価になった。


gluPerspectiveはglFrustumの上下対称左右対称限定版で、
引数の取り方をちょっと変更したものと言える。


texに慣れてきたところで次回に投影行列の中身に入る。

なんかTexの挙動が怪しいような

とりあえず区切れるところは全部スペース入れてみた
なんということだ。
ページ内に大量(というほどでもないが)のtexがあると全部処理できてない。
mimetexcgiが連続要求を蹴ってるくさいな。
画像化して埋めてなかったのか・・・
リクエスト数を減らすべくなるべく連結してみた。
1ページにつき3個まで?


PersepectiveをPerspectiveに直した。
eが多い。