【问题标题】:Continuous Physics Engine's Collision Detection Techniques连续物理引擎的碰撞检测技术
【发布时间】:2012-01-07 02:13:44
【问题描述】:

我正在开发一个纯连续物理引擎,我需要选择用于广泛和窄相碰撞检测的算法。 “纯连续”意味着我从不进行交叉测试,而是想找到方法在每次碰撞发生之前捕获它,并将每个碰撞放入由 TOI 排序的“计划碰撞”堆栈中。

广泛阶段 我能想到的唯一连续的宽相位方法是将每个物体围成一个圆圈并测试每个圆圈是否会与另一个圆圈重叠。然而,这似乎非常低效,并且缺乏任何剔除。

我也不知道对于当今的离散碰撞剔除方法(例如四叉树)可能存在哪些连续类似物。 我应该如何防止像离散引擎那样的不适当和无意义的广泛测试?

窄相
我已经设法使窄 SAT 适应连续检查而不是离散检查,但我确信在你们可能遇到的论文或网站中还有其他更好的算法。
各种快速或准确你建议我使用哪些算法,每种算法的优点/缺点是什么?

最后说明:
我说技术而不是算法,因为我还没有决定如何存储不同的多边形,这些多边形可能是凹的、凸的、圆形的,甚至有孔。我计划根据算法的要求对此做出决定(例如,如果我选择一种将多边形分解为三角形或凸形的算法,我将简单地以这种形式存储多边形数据)。

【问题讨论】:

  • assert( Make_a_list == not_constructive_close)
  • 如果您还不知道,我会推荐 Real-time Collision Detection 作为一个很好的资源。
  • 你是如何实现你的动态的,你是否以持续的方式做到这一点?如果您的系统是线性的,那么您应该能够使用状态转换矩阵、碰撞条件和寻根器(如牛顿法)简单地求解下一次碰撞时间。如果您的系统不是线性的,那么无论如何您都必须使用时间步进器来解决动力学问题,除非您有额外的结构,在这种情况下您可能应该提到这一点。
  • @VladSeghete 以连续方式实施我的动态是什么意思?我的系统是线性的,所以我确实用根查找器解决了边界圆之间的碰撞时间,但我目前的问题是如何清除甚至可能不会相互接近的边界圆之间的测试。有没有办法用离散四叉树方法的连续模拟来组织我的碰撞空间?或者类似的东西?
  • 如果物体可以旋转,我会说你的系统不是线性的。也就是说,一个顶点的轨迹一般不是直线。

标签: algorithm 2d collision-detection physics simulation


【解决方案1】:

你说的是圆圈,所以我假设你有 2D 对象。您可以通过添加时间维度将 2D 对象(或其边界形状)扩展到 3D,然后您可以使用常规技术检查一组 3D 对象之间的静态碰撞。

例如,如果您在 (x, y) 中有一个圆以恒定速度向右 (+x) 移动,那么当您使用时间维度扩展它时,您在 (x, y) 中有一个对角圆柱体, t)。通过在这些 3D 对象之间进行交集(只需将时间视为 z),您可以查看两个对象是否会相交。如果点 P 是一个交点,那么您只需查看 P.t. 即可知道该交点的时间

这也可以推广到更高的维度,尽管数学变得很难(无论如何对我来说)。

如果对象具有复杂的路径,则碰撞检测可能会很棘手。例如,如果你的圆受重力影响,那么被挤压的时空物体是抛物线球面扫掠,而不是简单的圆柱体。您可以稍微填充边界对象并在较短的时间内使用线性近似值并进行迭代,但我不确定这是否违反了您所说的连续。

【讨论】:

    【解决方案2】:

    我将假设您在模拟中需要重力或其他保守力之类的东西。如果是这种情况,您的物体的轨迹很可能不会是线,在这种情况下,就像 Adrian 指出的那样,数学会有些困难。我想不出一种方法来避免检查所有可能的曲线组合是否有碰撞,但是你可以很容易地计算两条曲线之间的最小距离,只要它们都是线性系统的解决方案(或者,一般来说,如果你有曲线的封闭形式解)。如果你知道 x1(t) = f(t)x2(t) = g(t) 那么你会想要什么 要做的是计算距离||x1(t) - x2(t)|| 并将其导数设置为零。这应该是一个取决于f(t)g(t) 及其派生词的表达式,并且会给您一个时间tmin(或者可能是几个可能的时间),然后您可以在该时间评估距离并检查它是否更大或小于r1+r2 --- 两个边界圆的半径之和。如果它更小,那么此时您可能会发生碰撞,因此您需要运行窄相位算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多