視錐台

frustum.png

視錐台とは?

透視投影するときに、この視錐台を使ってオブジェクトがクリッピングされるのだ。
クリッピングされた後、投影される。
人間の視野は本当は不規則な形状の円錐形なのである。
しかし、角錐形にした方が数学的に扱いやすいので3DCGでは角錐形を使っているのだ。
その方が矩形のビューポートの概念にも一致しているから。

ソースコード

frustum.h(git)
視錐台は投影行列ビュー行列で定義できる。
投影行列だけでいいじゃん?って思うかもしれないけど、視錐台カリングしてこのオブジェクトは視界の外だ内だってテストするためには、
ビュー行列も必要なのである。
ここではOpenGL前提で話を進める。つまり右手座標系だってことだ。
投影行列とビュー行列はOpenGLだと次の2つの命令で定義する。

gluPerspective(fov, ratio, nearDist, farDist);
gluLookAt(px,py,pz, lx,ly,lz, ux,uy,uz);

frustum.png

nearクリッピング面、farクリッピング面の求め方

(1)
\begin{align} nearHeight=2 tan(\frac{fov}{2})nearDist\\ nearWidth=nearHeight・ratio \end{align}
  • ratioはアスペクト比
  • fovはfield of viewの略で視野角である。普通はy方向の視野角を使う。
(2)
\begin{align} farHeight=2 tan(\frac{fov}{2})farDist\\ farWidth=farHeight・ratio \end{align}
Bibliography

参考にした書籍


triangle unproject

サポートサイト Wikidot.com triangleunproject