1中我们最后提到了对显示几何形体和光线求交的加速结构:bounding box
接下来我们将谈到关于该加速结构的加速结构
这是在bounding box之后但是在光线追踪之前的一步
将bounding box划分成多个相同的小格子
(前提假设是判断光线是否和格子相交要比判断光线是否和物体相交简单)
同时每个格子中都存贮着该格子是否和
当光线穿过一个格子时,先判定是否与格子相交
如果相交,再判断该格子内是否有物体,如果有物体,说明光线有可能和物体相交
接着对光线和物体求交,得到结果
通过实践得到的经验:
正常情况下格子的数量为物体的数量*27比较好
这里有一个光栅化一条线的问题
但是这样简单的均匀的分法有两个问题
1.有效率不够高的问题,这样的方法适用于物体分布比较均匀的位置,当物体的分布非常的不均匀,如大草原中间放了一个茶壶,这样的方法就不再适用,这是划分格子的问题
2.判断格子和物体是否相交是非常复杂的问题
为了解决第一个问题,提出了以下几种划分的方法:
大体上有两种,第一种是空间划分,第二种是物体划分
空间划分:
Oct-Tree 八叉树
在空间中是八叉树,切两刀将一个正方体分成八块
在平面上就是切成四块(四维就是16叉树)
如何判定什么时候不再往下切?
比如切了之后四块中有三块不与物体有交点,那么就可以回到没有切的状态
这个取决于不同的标准
但是八叉树不好用,当维度高的时候会很复杂
KD-Tree
KD-Tree是对八叉树的一个改进,使得无论什么维度下,都不用管维度的变化
KD-Tree每一次切都是沿着某一个轴切
比如平面上,先沿x轴切一刀,再沿y轴切一刀,如此循环,在三维中就是沿着xyz的顺序切
空间划分成了类似二叉树的结构
交替的切可以使得每个格子比较均匀
另外一种平衡的方式:每一次都切最长的轴
BSP-Tree
这种划分不太好,是对空间的划分的方法
在平面中只需要一条线,但是在三维中就需要一个面
更高维度的空间需要超平面,会很复杂
KD-Tree是比较常用的,但是现在也用的少了
以上的问题在于同一个物体可能同时出现在不同的格子中
物体划分:
是现在用的比较多的方法(同时也是作业6中要实现的算法)
和按照空间划分不同,这里是按照物体(三角形画划分)
将整个bounding box分成两堆三角形
再重新分别求bounding box
再对两堆三角形按照上述方法再次判断
解决了KD-Tree的问题:每个物体只会在一个格子中。
(算法的伪代码)