二进制空间分区的实现是通过使用超平面作为分区将空间递归地细分为两个凸集。这种细分过程以树状数据结构(称为BSP树)的形式产生了空间内对象的表示形式。
二进制空间划分是在1969年的3D计算机图形学中出现的,其中BSP树的结构允许提供有关场景中对象的空间信息,这些信息对于渲染非常有用,例如从前到后对对象进行排序给定位置的观看者,以便快速访问。
二进制空间划分的需求
由计算机图形产生的二进制空间划分需要快速绘制由多边形组成的三维场景。绘制此类场景的一种简单方法是绘制器算法,该算法可生成与观察者,从前到后,在背景上绘制以及与每个较近对象具有先前多边形的距离顺序的多边形。这种方法有两个缺点:将多边形按从前到后的顺序排序所需的时间,以及在重叠的多边形中可能出现错误的可能性。 Fuchs及其合作者表明,构建BSP树可以通过提供一种针对给定视点(场景中多边形数量的线性关系)对多边形进行排序的快速方法,以及通过细分重叠的多边形来避免出现错误的方法,从而解决了这两个问题画家的算法可能会发生这种情况。
BSP概述
二进制空间分区被视为将场景递归地划分为两个直到满足一个或多个要求的通用过程。可以将其视为对其他空间树结构(例如kd树和四叉树)的概括,其中划分空间的超平面可能具有任何方向,而不是像在kd树或四叉树中那样与坐标轴对齐。
当在计算机图形中实施以渲染由平面多边形组成的场景时,经常选择分区平面以使其与场景中多边形定义的平面重合。分区平面的具体选择和完成分区过程的标准取决于BSP树的目的。
例如:在计算机图形渲染中,场景被划分为直到BSP树的每个节点,除非BSP树的每个节点仅包含可以按任意顺序渲染的多边形。因此,当实施背面剔除时,每个节点都由一组凸多边形组成,而在渲染双面多边形时,BSP树的每个节点仅由一个平面中的多边形组成。
从多边形列表生成BSP树的算法
- 从列表中选择一个多边形P。
- 在BSP树中使节点N,然后将P添加到该节点处的多边形列表中。
- 对于列表中的其他多边形:
- 如果该多边形完全在包含P的平面的前面,请将该多边形移动到P前面的节点列表。
- 如果该多边形完全在包含P的平面的后面,则将该多边形移到P后面的节点列表。
- 如果该多边形与包含P的平面相交,请将其分成两个多边形,然后将其移动到P后面和前面的相应多边形列表中。
- 如果该多边形位于包含P的平面中,则将其添加到节点N处的多边形列表中。
- 将此算法应用于P前面的多边形列表。
- 将此算法应用于P后面的多边形列表。
BSP的缺点
- 生成BSP树可能很耗时。
- BSP不能解决可见表面确定的问题。
BSP的用途
- 它用于3D视频游戏和机器人技术中的碰撞检测。
- 用于光线追踪
- 它涉及复杂空间场景的处理。