BSP(Binary Space Partition,二叉空间分割)方法,在大型3d游戏场景管理方面,可以认为是已经证明了的,最成熟的,最经得起考验的场景管理方法。诸如虚幻系列引擎(Unreal 1,2,3),ID系列以及衍生产品(Quake,DOOM,Half-Life2),都采用了BSP方法来管理场景,尽管他们各自在实现上略有不同,但是基本原理都是相同的,下面将以Quake3的实现为例,简要介绍一下BSP的原理:
 
1.      选取分割平面:用这个平面将全部空间分成两个半空间,比如这个平面可以取简单凸体的侧表面,或者复杂物体(曲面或者静态模型)的boundingbox的侧表面,或者来自于等分格子的边界平面:假定所有参与分割的都是凸体表面;
1)每次取得分割平面后,都会将所有物体分为两组,所有物体的侧表面将分为4类:
a)  位于平面之前的侧面
b)位于平面之后的侧面
c)和平面重合的侧面,根据朝向决定分到哪个子空间。
d)跨越平面两侧的侧面,用平面分割成两半,分别放入子空间。
2)分割平面评优原则:
a)  位于平面之前和位于之后的侧面数量差尽可能小
b)  和平面重合的侧面尽可能多
c)  跨越平面两侧的平面尽可能少
d)  轴对齐分割加分
2.      在子空间的所有凸体侧面中选取分割平面,备选平面中选取一个平面来递归分割子空间。
1)递归结束的条件:是找不到分割平面为止。
2)控制二叉树的深度:可以采取以下策略,比如限定叶子结点的最小体积。当分割的子空间达到最小体积,或者树深到达了最大深度而又找不到更好的平面,也可以强行结束。因为太小的体积,人无法进入,也就没有比较继续分割,原则上叶子空间不小于可进入实体的体积;太大的树深,会增大定位叶子结点的开销。另外,控制平衡本身也会影响树深。
3.      分割的最终结果:形成一个二分层次空间。每个子空间结点包含的必要信息:
1)  分割平面
2)  围成凸空间的顶点和侧面(不一定是可渲染得表面)
3)  BRUSH:属于自己的一组侧表面。
4)  叶子结点无缝、网状连接。叶子空间形成一个CELL,CELL侧表面也可能是可以通过的PORTAL,也可能是实体表面。
4.      运行时定位相机位置所在的叶子空间:从顶层开始,根据观察点相对分割平面前后关系确定在那个半空间,直到到达一个叶子结点。
5.      渲染顺序:
1)  不透明PASS:从相机所在叶子结点开始,从前往后绘制空间内包含的可渲染表面。
2)  透明PASS:从相机所在叶子节点开始,从后往前绘制空间内包含的可渲染表面
3)  在过去没有Z BUFFER的时代,可以采用一个PASS全部从后往前的顺序来保证正确的前后关系。现代显卡都有硬件Z BUFFER,所有对于不透明的PASS,可以从前往后绘制,来优化填充率。
4)  每个BSP结点都有一个分割平面,每个分割平面连接两个结点,从相机所在叶子结点,找到兄弟节点,再找到父亲节点,递归的到达根节点。然后进入另一个分支,遍历完所有节点。
6.      碰撞检测:有了网状连接的CELL,只需要检测活动实体所在得CELL周围的侧壁碰撞检测,以及位于CELL内的其他实体。大大缩小检测范围。
7.      PVS:淹灌法找到每个CELL可以到达的PORTAL(注意,不是光线可以到达,是行走可以到达)。然后从行走可以到达的PORTAL集合中寻找光线可以到达的PORTAL;对于一个CELL来说,能够看到另一个CELL的PORTAL,说明可以看到那个CELL;水淹法得到的可行走到达的CELL可以用作AI判断是否可以到达,另外也也可以加速寻找光线可以到达的cell集合。