使用AABB或OBB怀疑的碰撞检测

时间:2011-09-25 19:50:53

标签: collision-detection bounding-box aabb

我已经了解了一些关于它的事情我想用这个做一些实现。但我有些疑惑。 de AABB的问题是对象必须是轴对齐的,否则你必须每帧重新计算bbox,是吗?重新计算是否昂贵?那么精度如何,你可以制作一个细分bbox的碰撞树吗?它如何与AABB一起使用?

OBB面向物体旋转,对吗?你必须在游戏之前建立树。我更难以实现并且有点昂贵,但我在精度方面获得了很多。但是,如果对象在游戏中旋转,bbox会自动重新计算其旋转吗?

哪一个最常用于游戏?为什么?

提前谢谢你:)

2 个答案:

答案 0 :(得分:4)

AABB,OBB,Spheres,Capsules ...之间的选择取决于您运行的模拟类型以及您的约束(通常是实时应用程序)。

您需要评估利弊并做出相应的选择。例如,使用AABB的测试非常快,但是当对象旋转时需要重新计算AABB。但是,如果您正在处理非常复杂的对象并处理BVH,则更新AABB树非常快,因为您只需要重新计算(“从头开始”)底部AABB,从子节点构建的较高的AABB的AABB。使用OBB,测试成本较高,但如果处理刚性对象,则无需重新计算OBB。

如果您决定使用可变形对象,AABB树(或Sphere树)绝对是一个更好的主意,因为您的树无论如何都需要更新。

问题是:什么会更昂贵,更新AABB树或OBB重叠测试产生的开销?所有这些都取决于您的模拟:对象复杂性,每秒平均CD测试等...您可以根据具有不同形状的不同方法(BVH,网格......)找到不同CD库的一些基准,并针对特定问题进行测试。 Here是您可能感兴趣的示例。

关于实施,由于所有这些都已在多年前研究并在许多图书馆中实施,因此您不应该有任何麻烦。你可以看一下Christer Ericson的实时碰撞检测,所有这些问题都得到了非常清楚的回答和解释。

您还可以使用不同形状的混合,例如一个用于宽相,另一个用于窄相(一旦你到达叶子),但你可能不需要这样的东西。

答案 1 :(得分:3)

AFAIK,大多数物理引擎使用AABBs +扫描和修剪算法进行广泛的碰撞检测。 对于动态对象之间的碰撞检测,树几乎没用。但是,树可以成功用于静态几何

  

de AABB的问题是对象必须是轴对齐的,   否则你必须每帧重新计算bbox,就是这样   正确?

是的,必须在每次改变身体方向时重新计算AABB。 但对盒子,胶囊,锥体,圆筒来说,这是一个非常便宜的操作。对于多边形模型肯定更昂贵,但低多边形模型的AABB计算具有正常的性能。

总而言之,AABB重新计算比昂贵的窄相位算法更好。