本文将给出在选择诸多解决方案,并考虑相互关系时涉及 的相关问题。
1.碰撞算法的设计因素
a.应用程序中对象的表达方式。
b.查询类型的多样化。
c.环境模拟参数。
d.系统的性能要求。
e.系统健壮性要求。
f.系统实现与应用的简易性。
2.应用程序中对象的表达
既是场景和物体的几何表达方式。
2.1对象的表达方式
“多边形汤”:一组无序的多边形构成的集合,可以适用与任意多边形集合,但没有考虑物体内部的连接信息,其效率低下并且算法的健壮性也较差;
多边形网格:多边形通过共用边连接起来的集合模型,最常用,带有内部顶点、边线、面的连接信息。
在数据描述上,分显示表达方式和隐式表达方式。
显示表达方式:指定具体的顶点、边、面数据值。
隐式表达方式:一般指可以通过数学表达式表示的几何体,如:球、椭圆、圆环等。
2.2碰撞与几何渲染
最好将渲染系统与碰撞检测系统分离开来。
a.不建议采用供渲染的几何体对象执行碰撞检测,而是采用同一位置的替代对象。
b.渲染几何体一般以一种特定的格式加以表达,如三角带、三角形列表等。而对于碰撞几何体,某些非三角形图元的使用有时会带来性能上的提升。
c.数据组织上,静态渲染几何体可按照材质的特征加以分类排序,内嵌诸如材质信息、顶点颜色、顶点法线等信息;而碰撞数据一般按照空间特征加以组织,并只保存碰撞所需相关信息,以2使碰撞数据最小化。
采用分离的碰撞几何体存在如下不利:
a.数据冗余,主要是顶点坐标数据冗余,内存额外占用。
b.渲染几何体和碰撞几何体如何保持同步。
采用与真实尺寸接近的替代几何体在游戏中是良好的选择。在游戏中,碰撞检测和反馈总是遵循“如果看上去是正确的,它就是正确的”这一法则。
2.3特定的碰撞检测算法
不建议设计并采用“全功能”的碰撞检测系统。例如:物体-物体间的碰撞与物体-场景间的碰撞分别采用不同的算法。
3.查询类型
布尔相交测试查询快速并易于实现。相交数据的计算过程一般比较困难,涉及一个或多个碰撞点。
4.环境模拟参数
考察:物体数量问题和物体运动方式。
4.1物体对象的数量
将包含大量物体对象的碰撞操作划分为两个阶段:粗略测试阶段(n体操作)和精确测试阶段(对组合操作)。
4.2顺序移动和同步移动
方案一:同步移动物体,利用粗略测试确定可能与当前划分组碰撞的其它划分组而非组对象。而每一个划分组将以不同的代价执行。
方案二:同步移动物体,发生相互贯穿后,将模拟状态恢复到早期状态加以解决。
方案三:以顺序方式处理运动问题,即每次只移动一个物体,若检测到碰撞,则进行处理,随后再继续处理下一个物体。针对游戏程序,通常可以忽略顺序移动模型所产生的问题。顺序移动的优点之一是:避免了单一物体的穿透现象。
4.3不连续运动与连续运动
静态碰撞测试:物体在运动过程中在每一个离散点是否发生碰撞,在每个离散点处,物体在其当前位置视为静止。
动态碰撞测试:考虑两个同时运动的物体时,采取相对运动方式,则当前行为就变为一个运动的物体朝向一个静止的物体执行碰撞测试。
5.性能
优化:平面结构执行空间划分、体空间测试、时间一致性。
6.健壮性
相关问题分为两类:数字精度的丢失和错误的几何体形状。贯穿于整个碰撞检测系统的设计和开发过程。
7.实现与使用的简洁性
成本、时间、测试策略。