2010年4月11日

BSP场景管理方法简介

BSPBinary 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)  叶子结点无缝、网状连接。叶子空间形成一个CELLCELL侧表面也可能是可以通过的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来说,能够看到另一个CELLPORTAL,说明可以看到那个CELL;水淹法得到的可行走到达的CELL可以用作AI判断是否可以到达,另外也也可以加速寻找光线可以到达的cell集合。

posted @ 2010-04-11 10:59 cgwolver 阅读(645) 评论(0) 编辑