您的位置:首页 > 其它

BSP场景管理方法简介

2011-01-28 09:16 531 查看
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集合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: