//Description: Frustum Culling
//Create Date: 2022-08-26 10:27:39
//Author: channy
视锥体剔除优化方案。使用八叉树构建层次包围盒。
其中,视锥体由六个平面组成
class Frustum {
public:
Frustum() {}
Plane plane_[6];
};
八叉树存储了根节点和最小包围盒阈值
每个八叉树节点存储该节点对应的包围盒、元素及元素id、子节点
n平面法向量与x空间上任意一点的点乘加上平面距离d = 0时,表示该点x在平面上,当<0时,表示在平面背面。当一个点位于视锥体6个平面的背面时,表示该点位于视锥体外。 \(n x + d = 0\)
如果一个点在上一次检测中位于视锥体外,那么下一次检测与上一次检测结果相同的可能性大。
即,一个点在上一次检测中在一平面外,下一次检测可优先检测该平面,尽早退出循环计算
在视锥体对称的情况下,检测包围盒中心点到顶点的距离,及视锥体中心到顶点的最大距离,并进行比较,只需要比较三个视锥体平面
一个包围盒位于视锥体某平面的背面,那么该包围盒所有子节点也位于视锥体该平面的背面,可以增加标记,在检测该包围盒的子节点时避免重复与该平面的计算
当知道视锥体的平移与旋转时,
Optimized View Frustum Culling Algorithms for Bounding Boxes
@article{assarsson2000optimized, title={Optimized view frustum culling algorithms for bounding boxes}, author={Assarsson, Ulf and Moller, Tomas}, journal={Journal of graphics tools}, volume={5}, number={1}, pages={9–22}, year={2000}, publisher={Taylor \& Francis} }