【问题标题】:Circle-Circle Collision Prediction圆圆碰撞预测
【发布时间】:2012-07-06 21:02:38
【问题描述】:

我知道如何检查两个圆是否相交。但是,有时圆圈移动得太快,最终会避免在下一帧发生碰撞。

我目前对该问题的解决方案是检查前一个位置和当前位置之间的任意次数的圆-圆碰撞。

有没有一种数学方法可以计算出两个圆相撞所需的时间?如果我能够得到那个时间值,我可以将圆圈移动到当时的位置,然后在那个点碰撞它们。

编辑:恒速

【问题讨论】:

  • 这有点模糊。你的圆圈的运动模式是什么?等速??
  • 恒速,是的。对不起,我不是 100% 如何问这个问题。我搜索了很多结果,只是为了提醒自己我的物理学不是最好的。
  • 是的,有办法。是的,我确信这是一个简单的计算。但是,我不知道它是什么 :( 不过我知道这是非常基本的微积分。
  • 该死。好吧,如果您有任何提示,请告诉我。 :)

标签: algorithm geometry collision prediction


【解决方案1】:

我假设圆圈的运动是线性的。假设圆A的中心位置由向量方程Ca = Oa + t*Da给出,其中

Ca = (Cax, Cay)是当前位置
Oa = (Oax, Oay)是起始位置
t是经过的时间
Da = (Dax, Day)是单位时间的位移(速度)。

对于圆 B 的中心也是如此:Cb = Ob + t*Db

然后你想找到 t 使得 ||Ca - Cb|| = (ra + rb) 其中rarb 分别是圆 A 和 B 的半径。

两边平方:
||Ca-Cb||^2 = (ra+rb)^2
和扩展:
(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2

从中你应该得到一个可以求解 t 的二次多项式(如果存在这样的 t)。

【讨论】:

  • 非常感谢!像魅力一样工作。
  • 这是一个很棒的等式.. 但不幸的是我的代数生锈了。如何重新排列该方程以一口气求解 T?
  • @MattKenefick 见here
【解决方案2】:

这是解决 Andrew Durward 出色答案中的方程的方法。

要插入值,可以跳到底部。

(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2


(Oax * (Oax + t*Dax - Obx - t*Dbx) + t*Dax * (Oax + t*Dax - Obx - t*Dbx)
 - Obx * (Oax + t*Dax - Obx - t*Dbx) - t*Dbx * (Oax + t*Dax - Obx - t*Dbx))
+
(Oay * (Oay + t*Day - Oby - t*Dby) + t*Day * (Oay + t*Day - Oby - t*Dby)
 - Oby * (Oay + t*Day - Oby - t*Dby) - t*Dby * (Oay + t*Day - Oby - t*Dby))
=
(ra + rb)^2


Oax^2 + (Oax * t*Dax) - (Oax * Obx) - (Oax * t*Dbx)
 + (t*Dax * Oax) + (t*Dax)^2 - (t*Dax * Obx) - (t*Dax * t*Dbx)
 - (Obx * Oax) - (Obx * t*Dax) + Obx^2 + (Obx * t*Dbx)
 - (t*Dbx * Oax) - (t*Dbx * t*Dax) + (t*Dbx * Obx) + (t*Dbx)^2
+
Oay^2 + (Oay * t*Day) - (Oay * Oby) - (Oay * t*Dby)
 + (t*Day * Oay) + (t*Day)^2 - (t*Day * Oby) - (t*Day * t*Dby)
 - (Oby * Oay) - (Oby * t*Day) + Oby^2 + (Oby * t*Dby)
 - (t*Dby * Oay) - (t*Dby * t*Day) + (t*Dby * Oby) + (t*Dby)^2
=
(ra + rb)^2


t^2 * (Dax^2 + Dbx^2 - (Dax * Dbx) - (Dbx * Dax)
       + Day^2 + Dby^2 - (Day * Dby) - (Dby * Day))
+
t * ((Oax * Dax) - (Oax * Dbx) + (Dax * Oax) - (Dax * Obx)
      - (Obx * Dax) + (Obx * Dbx) - (Dbx * Oax) + (Dbx * Obx)
      + (Oay * Day) - (Oay * Dby) + (Day * Oay) - (Day * Oby)
      - (Oby * Day) + (Oby * Dby) - (Dby * Oay) + (Dby * Oby))
+
Oax^2 - (Oax * Obx) - (Obx * Oax) + Obx^2
  + Oay^2 - (Oay * Oby) - (Oby * Oay) + Oby^2 - (ra + rb)^2
=
0

现在它是一个标准形式的二次方程:

ax2 + bx + c = 0

这样解决:

x = (−b ± sqrt(b^2 - 4ac)) / 2a       // this x here is t

在哪里--

a = Dax^2 + Dbx^2 + Day^2 + Dby^2 - (2 * Dax * Dbx) - (2 * Day * Dby)

b = (2 * Oax * Dax) - (2 * Oax * Dbx) - (2 * Obx * Dax) + (2 * Obx * Dbx)
     + (2 * Oay * Day) - (2 * Oay * Dby) - (2 * Oby * Day) + (2 * Oby * Dby)

c = Oax^2 + Obx^2 + Oay^2 + Oby^2
    - (2 * Oax * Obx) - (2 * Oay * Oby) - (ra + rb)^2

t存在(会发生碰撞)如果--

(a != 0) && (b^2 >= 4ac)

【讨论】:

    【解决方案3】:

    您可以使用方向矢量和速度来预测碰撞,这将为您提供后续步骤,以及它们何时会发生碰撞(如果有的话)。

    你只需要检查线交叉算法来检测...

    【讨论】:

    • 嗯,我有位置、速度和方向都可以用于我需要的任何算法。我已经可以很好地检测到圆形碰撞。只是我的项目每 1/60 秒更新一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多