我已经读过一些相关内容,我想用它来做一些实现。但我有一些疑问。 de AABB 的问题是对象必须轴对齐,否则你必须每帧重新计算 bbox,对吗?重新计算成本高吗?那么精度呢,你能制作一个细分bbox的碰撞树吗?它如何与 AABB 配合使用?
OBB 是面向物体旋转的,对吧?您必须在游戏初始化之前构建树。我读到它的实施要困难得多,而且有点昂贵,但我在精度方面获得了很多。但是如果物体在游戏中旋转,bbox 会“自动”重新计算其旋转吗?
游戏中最常用的是哪一种?为什么?
提前谢谢您
AABB、OBB、球体、胶囊之间的选择...取决于您正在运行的模拟类型以及您的约束(通常是实时应用程序)。
您需要评估利弊并做出相应的选择。例如,使用 AABB 进行测试非常快,但当对象旋转时需要重新计算 AABB。但是,如果您正在处理非常复杂的对象并处理BVH,则更新 AABB 树非常快,因为您只需要重新计算(“从头开始”)底部 AABB,而较高的 AABB 是从子 AABB 构造的。使用 OBB,测试成本更高,但如果您处理的是刚性对象,则无需重新计算 OBB。
如果您决定使用可变形对象,那么 AABB 树(或球体树)绝对是一个更好的主意,因为无论如何您的树都需要更新。
问题是:更新 AABB 树产生的开销还是 OBB 重叠测试产生的开销,哪个成本更高?所有这些都取决于您的模拟:对象复杂性、每秒平均 CD 测试等...您可以找到基于具有不同形状的不同方法(BVH、网格...)的不同 CD 库的一些基准,并针对特定问题进行测试。 这里是一个您可能会感兴趣的示例。
关于实施,由于所有这些都是多年前研究过的,并且在许多图书馆中实施过,所以你不应该有任何麻烦。您可以看一下 Christer Ericson 的《实时碰撞检测》,所有这些问题都得到了非常清楚的回答和解释。 您还可以混合使用不同形状,例如一个用于宽阶段,另一个用于窄阶段(一旦到达叶子),但您可能不需要这样的东西。
de AABB 的问题是对象必须轴对齐, 否则你必须每帧重新计算 bbox,是吗? 对吗?
是的,每次改变身体方向时都必须重新计算 AABB。 但对于盒子、胶囊、圆锥体、圆柱体来说,这是一种非常便宜的操作。对于多边形模型肯定更昂贵,但是低多边形模型的 AABB 计算具有正常的性能。
总而言之,AABB重算优于昂贵的窄相位算法。