frustum culling是可见性检测中一种重要方法,当然也是优化 的重头戏之一;
目前经常使用的是camera所形成的frustum平面culling的方法:
首先根据camera的几项重要value我们有:
- near/far plane
- fov:field of view--远平面的height/far;
- aspect:远平面的width/heith或者width/height
根据这些我们可以构造6个平面,
对于空间一点p:(x,y,z),可以用平面公式 dot[(x,y,z,1),(px,py,pz,w)]判断其在平面正面或者背面;
进而可以得到complete out, intersect, complete in这样的结果;
计算过程需要6次dot;
这是对多平面的通用做法,没有用到frustum的特性,所以不是最好;
在game programming gems 1.6章节中,提倡利用frustum的特性,以极坐标的方式看待frustem,那么对于3D空间中frustum我们可以把它看成(半径,fov_w,fov_h),进而进行判断,这样进行判断就只用3个dot就可以;
判断过程快了1倍;
另外现在场景组织中经常用BVTree(bounding volume tree)这种,层次化结构,它的优势显而易见,而在我们的frustum可见性判断过程中可以进一步优化:
如果一个bounding volume不是complete in/comple out,但是它在near/far这一项上是complete in的,就可以在children判定的部分免去判定near/far这一项;
pretty good an article;