【问题标题】:Axis-Aligned Bounding Boxes vs Bounding Ellipse轴对齐边界框与边界椭圆
【发布时间】:2011-11-26 21:15:23
【问题描述】:

为什么当今大多数(如果不是所有)碰撞检测算法都要求每个 2D 物体都有一个 AABB,仅用于广泛阶段?

在我看来,简单地在 2D 身体的质心处放置一个圆,并将半径扩展到该圆包含整个身体的位置将是最佳的。这不需要在身体旋转和广泛的重叠计算会更快。对吗?

奖励:
边界椭圆是否也适用于广泛的相位计算,因为它可以更好地表示长而细的形状?或者它是否需要大量计算,违背了广泛相位的目的?

【问题讨论】:

    标签: algorithm 2d collision-detection physics


    【解决方案1】:

    边界框由线性不等式约束表示,而圆形和椭圆则需要二次不等式约束。两者都可以使用,但线性情况一如既往地在算法上解决起来要简单得多(它只涉及矩阵乘法)。如果边界框与世界坐标轴对齐,则所有检查类似于xa - xb > dxa + dxbya - yb > dya + dybza - zb > dza + dzb,其中d$i$j$i$ 中对象$j 周围边界框的尺寸方向。

    椭圆碰撞检测正在完成,但是。数学要困难得多,实施和计算工作可能不值得节省。无论如何,我在 Google 学者中搜索了“椭圆碰撞检测”,首页上至少有两篇论文似乎正是关于这个主题:http://hub.hku.hk/bitstream/10722/47091/1/121854.pdf?accept=1ftp://crack.seismo.unr.edu/downloads/russell/doven_2005_neighbor_list_collision_driven_MD_II.PDF

    【讨论】:

      【解决方案2】:

      为什么现在大多数(如果不是全部)碰撞检测算法 要求每个 2D 物体都有一个 AABB 用于广泛阶段 只有?

      只有当被近似的对象是圆形时,球体才真正是一个很好的近似。在一般情况下,边界球最终会比被逼近的对象大得多。想象一个长矩形。即使旋转矩形,AABB 也提供比球体更紧密的近似。 球体重叠测试很便宜,但 AABB 重叠测试也很便宜。

      在我看来,这就像简单地在 2D 身体的质心处放置一个圆圈, 并将半径扩展到圆包含整个 身体将是最佳的。

      为了使用球体提供最佳拟合,球体需要从对象的质心偏移。对象的质心只为对称对象提供最佳拟合。 找到最适合任意对象的方法似乎是一个不平凡的问题。见这里:How to compute the smallest bounding sphere enclosing other bounding spheres

      主体旋转和变宽后无需更新 重叠计算也会更快。

      仅使用基于质心的方法(除非您预先计算偏移量,将其存储在某处并在移动时通过对象的位置和旋转对其进行变换),如前所述,这并不能提供最紧密的拟合。由于拟合通常不紧密,因此您的 broadphase 不会过滤掉很多对象,您最终会浪费更多时间进行更昂贵的检查。

      边界椭圆是否适用于广泛的相位计算 另外,因为它会更好地代表又长又瘦的形状?

      椭球很难在数学上处理,任何与椭球相交的测试都将远远超过它们提供的更紧密拟合的好处。 然而,有一种特殊情况:轴对齐的椭球体。 如果您的椭球体是一个只能沿 X、Y 或 Z(或其组合)而不是沿任何轴(或沿 X、Y 或 Z 拉伸然后旋转)拉伸的球体,则有一个技巧:
      如果你将一个椭球的半径除以它们自己,你最终会得到一个单位球体。 如果您对正在检查的对象与椭球做同样的事情,您最终会得到一个单位球体与 X 测试。

      以下是检查轴对齐椭圆体是否与 AABB 重叠的算法示例:

      1. 您将椭球的位置除以椭球的半径。我们将新位置称为position_es(es = 椭球空间)。
      2. 您将 AABB 的最小和最大坐标(或您使用的任何表示)除以椭圆体的半径。我们会打电话给新的 AABB aabb_es
      3. 您检查aabb_es 与位于position_es 的单位球体。

      上述算法是以下论文中提出的扫描椭球碰撞检测背后的思想:
      Kasper Fauerby 的“改进的碰撞检测和响应”:https://peroxide.dk/papers/collision/collision.pdf

      【讨论】: