Scene Management(场景管理):场景中的Game Object(GO)由一个场景系统管理,GO根据其特定的ID或位置进行排序。若不进行场景管理,场景中需要加载的GO过多可能会导致全部程序无法再一帧内完成。而进行场景管理后,物体可以根据离摄像机的远近顺序进行不同的处理。常见的场景管理方式包括网格,四叉树,八叉树,BSP,BVH等。
场景管理中存在两个概念:场景物体和游戏场景。游戏中所有具有空间属性的物体都是场景物体,所有场景物体构成的集合成为游戏场景。
场景管理的作用:便于快速定位场景里的对象,妥善解决处理巨大场景带来的内存开销问题和渲染效率问题(如渲染过程中的剔除,可以剔除所有不可视的结点空间),处理大量对象碰撞检测的效率问题(最后一点非常重要!)。
二维空间的管理和对象检测可以用四叉树处理,而三维空间则可以用八叉树处理。
四叉树:一种树形结构,每个结点最多包含四个子节点。四叉树可以将一个空间划分为四个空间,每个空间对应一个子节点。如果一个区域包含了超出阈值的多个数据点,该区域会被再次划分为四个子区域,直到每个区域都只包含低于阈值的数据点为止。四叉树一般用于二维空间的场景管理上。
八叉树:八叉树和四叉树的实现算法相似,但是八叉树是将三维空间划分为八个大小相等的子空间,它也常被用于三维空间的空间管理。
KD-Tree:kd树是每个节点都为k维点的二叉树,所有非叶子节点都可以是做用一个超平面把空间分为两个半空间。节点左边的子表表示超平面左侧空间中的对象,右节点表示超平面右侧空间中的对象。它的构造过程和八叉树类似,最大的不同就是垂直分割面的确定:通常在三维空间中,会随着树的深度增加将与X/Y/Z轴垂直的三个平面轮流作为分割面。
BSP Tree:二叉空间分割树,也称为BSP树。它可以被视为二叉树的推广,但是可以任意选择分割平面的方向和位置。二叉空间分割树产生于计算机图形学需要快速绘制由多边形组成的三维场景。绘制此类场景的一种简单方法是画家算法,该算法按照与观察者的距离、从后到前、在背景上绘画以及每个较近对象的先前多边形的顺序生成多边形。这种方法有两个缺点:按从后到前的顺序对多边形进行排序所需的时间,以及多边形可能重叠。在使用画家算法时,构建BSP树通过提供一种根据给定视点(场景中的多边形数量呈线性)对多边形进行排序的快速方法,并通过细分重叠多边形可以避免这两个问题。
简单来说,就是一种针对可见墙壁快速排序的算法,常用于室内复杂场景的渲染。
BVH树:简单来说,就是用一个二叉树结构来管理对象的包围盒。每个结点都代表一个包围了该子树下所有对象的AABB包围盒,可以用于光线追踪算法和碰撞检测算法的加速。
碰撞检测:判断两个物体是否发生了碰撞,如果发生了碰撞,位置和力度是多少。一般分为两个阶段。首先是Borad phase,使用AABB包围盒快速计算物体间有没有可能发生碰撞。如果有可能,则会进入Narrow phase,来计算碰撞的点和力度。
Broad Phase:常用的两种方法一个是BVH Tree,其优点是动态更新非常快。另一个方法是Sort and Sweep,这个速度更快,对物体的AABB按轴坐标进行排序,并判断是否有交集。由于游戏中多数为静态物体,因此当物体发生运动时,只需要改变其中局部的部分变量,因此更新所需的代价低,从而效率非常高。
Narrow Phase:需要计算碰撞的位置,速度和产生力的方向。这些信息不止被运用在物理部分,同样也会被运用在声音,动画和特效等部分。
基础的包围盒求交包括简单的球形,胶囊形,立方形求交。而复杂的凸包求交则可以用明可夫斯基差(明可夫斯基差形成的多边形是否覆盖原点),或者使用分离轴定理(若不相交,一定存在一条轴能分离两个多边形)。