🧊

フラスタムカリング(視錐台カリング)

2022/06/09に公開

カメラの視錐台の範囲に入ったメッシュのみを描画するメジャーな方法。

計算方法
任意空間上の点vとプロジェクション空間への変換行列Mがあるとする。

たとえばvがオブジェクト空間であればMはMVP行列、vがビュー空間であればMはP行列といったような。
点vがカメラの視錐台のなかにあるかどうかを調べるにはまず[

vM=(x',y',z',w')

とする。vMは空間上の点をプロジェクション空間に変換したものである。

例えば視錐台の左側について注目すると

w' < x’

が成り立つ。

どうして成り立つかと言うとプロジェクション空間内部に描画される点はDirectX系の場合、最終的にGPUで処理される座標(X,Y,Z)にたいして以下の範囲が描画されるためである。

-1 < X < 1-1 < Y < 1-1 < Z < 1

このX,Y,ZはGPUパイプライン内部でw除算されることになっている。

(詳細: 今度こそ理解するプロジェクション変換行列のつくりかた)

よってx軸のminに注目すると以下のように式変形ができる。

-1 < x'/w' \Leftrightarrow -w' < x'

もしかしたら解釈間違えているかも。以上を前提として以下の資料を読めばわかる

https://www.gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf

結論だけ書いておくと

0 < v \cdot (row4 + row1) left
0 < v \cdot (row4 - row1) right
0 < v \cdot (row4 + row2) bottom
0 < v \cdot (row4 - row2) top
0 < v \cdot (row4 + row3) near
0 < v \cdot (row4 - row3) far

のとき、視錐台内部に点がある。なので「視錐台平面」みたいな表現をされる場合大体はrow4+row1側のfloat[6]であり、

dot(v, planes[i])みたいな表記をよく見る。

vは任意の点V
v = (x, y, z)

M は プロジェクション空間への変換行列

M=
row1 (m11, m21, m31, m41),
row2 (m12, m22, m32, m42),
row3 (m13, m23, m33, m43),
row4 (m14, m24, m34, m44)

参考リンク

フラスタムカリング入門、良いフラスタムの作り方

Discussion