在写Ambient Occlusion时需要进行射线与物体的各个三角形的碰撞检测
但是逐个三角形进行判断需要进行大量的无意义计算
可以通过一个八叉树管理物体的包围盒空间
通过八叉树对物体的包围盒进行空间管理
这样判断射线是否与物体相交时可以省去大量的计算
当射线与某一个空间有相交的话,则进一步判断子空间与射线的相交性
算法描述:
判断当前节点空间中的三角形数是否小于我们设置的一个阀值,若小于则该节点设置为叶子节点(即无子节点)
若大于该阀值,则将该空间分为8份,并判断出在各子空间中的三角形,然后再对其子节点进行判断
将节点所在空间为分8份比较简单,假设当前节点所表示空间的包围盒为Bound
则Bound.Center为该包围盒的中心,Bound.Extents为该包围盒中心到各边的距离
八个子空间的长宽高都为父空间的一半,
八个子空间中心的坐标分别为Bound.Center向八个方向移动0.5f * Bound.Extents的距离
首先我们先分析下节点的结构体:
我们要通过八叉树管理空间,则所有的节点都需要维护一个包围盒,表示节点所表示的空间
且每个叶子空间中都应该维护一份索引列