课程来源:GAMES101-现代计算机图形学入门-闫令琪 Lecture14
GAMES101 现代计算机图形学入门
主讲老师:闫令琪,UCSB
课程主页:https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html
Uniform Spatial Partitions 均匀空间划分
Preprocess – Build Acceleration Grid 预处理-构建加速网格
-
寻找包围盒
-
划分成格子
-
将每个对象存储在重叠的单元格中
-
按光线遍历的顺序逐步穿过网格
-
对于每个网格单元格,测试与存储在该单元格中的所有对象的交集
-
当光线与格子有交点时,判断格子内是否有物体,如果有,判断光线是否与格子内的物体相交,如果没有,那么不做判断。当光线和格子内的物体相交,查找结束。
-
光线经过第一个格子,如何求得下一个光要经过格子是什么呢?
-
由于光是往右上打的,那么下一个格子一定是往右或者上的格子。
-
2d的这个原理,也可以推导到3d去。
-
这个方法加速效果如何?
-
一个格子,完全没有效率提升。
-
划分了太多格子,效率下降。
-
在中间找到一个平衡点……
-
但是当场景不同时,尤其是物体大规模集中,又大规模空白时,就很难处理了。
-
那么,在同一个空间里,用不同的方法划分呢?
Spatial Partitioning Examples 空间划分示例
- 八叉树
八叉树在划分到某个格子内没有物体时,就没必要划分了(如果划分,会造成性能损耗)。 - KD树——和维度没有关系
每次KD树找到一个东西,那么它会沿着某个轴(水平的或者竖直的),砍一刀。水平一次,竖直一次,就能基本均匀地划分,并且是一种二叉树。(在三维,就是沿着x砍一刀,再沿着y砍一刀,再沿着z砍一刀,再沿着x……) - BSP树
BSP树是一种二分的方法,每次选择一个方向砍,但这样会破坏它的AABB结构。
KD Tree Pre-Processing – KD树预处理
- 总结
Traversing a KD-Tree
- 判定是否和A有交点,有。考虑和它的子节点是否也有交点,并且和A里所有的物体求交点。(当光线和父节点没有交点时,那么就不可能和它的子节点有交点)
- 理论上左边的区域也是要继续划分的,但是我们按照规则来,就不划分它了。
- 和A的子节点,右边区域(B)求交点,有。再和它的子节点求交点。
- 用这种方法一直找,找到叶子结点的交点,那么就该求交点了。