BSP 树

BSP 树也是空间划分类树的一种,类似于 kd 树,但和 kd 树不同的是,kd 树用轴对齐平面(横平竖直)且层层交替,而 BSP 树可用任意角度平面。

BSP 树的内部节点存一个分割平面,叶节点存对象集合,根节点下的子节点都是区域内的区域或对象。

BSP 树的建树方式主要通过「前面」和「后面」来建树。从一个对象开始,(空间意义上的,例如2d就是线上/线下,3d就是平面前/后)在对象前面的对象作为一组,后面的对象作为另一组,从而得到两组,再分别对两组进行递归建树。(注,对与「跨越」的物体,也就是穿过平面即在前面也在后面有部分的物体,做法是将跨越的物体切割为在前面的部分和在后面的部分处理) 在参考资料的链接文章中有图示

画家算法

BSP 树的出现解决了画家算法的问题。

画家算法来自于计算机图形学对快速绘制由多边形组成的三维场景而产生的问题。算法按照与观察者的距离从后到前地在背景上进行绘画,但前提是需要对绘制对象有从后到前顺序。

BSP 树能够为画家算法提供快速判断谁在前面的能力。通过特定的遍历树方法就可以轻松的从前到后进行绘制。即便观察者位置改变,也不需要重建树,只需要更改遍历开始的位置就可以了。

同时作为空间划分树的一种,其同样可以用来判断一个点在世界哪片区域里,从而用来优化碰撞检测。

但缺点同样也有。其一是构建树需要选择较优的分割面,否则树就会不平衡;其二是如果遇到要切分跨越的物体过多很可能会导致数据量暴涨;其三就是对移动的物体不友好,因为移动的物体会破坏构建好的树。

补充

  • 遍历的“特定方法”:从根开始,判断观察者在分割平面的哪一侧,先递归绘制“对面”(远处)的子树,再绘制当前节点上的物体,最后递归绘制“同侧”(近处)的子树。

参考资料