【问题标题】:Circle-Circle Collision Prediction (followup)圆-圆碰撞预测(后续)
【发布时间】:2018-06-03 06:40:40
【问题描述】:

圆 A 沿 x 轴向右移动。圆 B 沿 y 轴向上移动。我想知道他们是否会发生碰撞。 (不是什么时候,只是如果。)

半径相同,等速不同。

This answer 似乎解决了这个问题,我的问题最好是对此的跟进。 (抱歉没有足够的声誉发表评论。)

我似乎无法求解 t(时间)所提供的方程(如果 t 存在,圆圈将发生碰撞):

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

这里又是可读的:

(CircleA.initialPosition.x + t*CircleA.velocity.x - 
 CircleB.initialPosition.x - t*CircleB.velocity.x)^2
+
(CircleA.initialPosition.y + t*CircleA.velocity.y - 
 CircleB.initialPosition.y - t*CircleB.velocity.y)^2
=
(CircleA.radius + CircleB.radius)^2

这在我的例子中稍微简单一些,因为圆圈沿着轴移动(速度在一个轴上为 0)并且半径相同:

(CircleA.initialPosition.x + t*CircleA.velocity.x - 
 CircleB.initialPosition.x)^2
+
(CircleA.initialPosition.y - CircleB.initialPosition.y - 
 t*CircleB.velocity.y)^2
=
(2*radius)^2

我仍然无法解决它,并且提供的 auto-solver 链接也对我的笨蛋没有帮助。

(特别是我不明白

sqrt(-(D4 - D3)^2)

sqrt() 中的表达式总是负数,所以它总是失败。我错过了什么?)

抛开自动求解器不谈,我希望有人能指出求解 t 方程的方法(也许版主可以结合问题,抱歉给您带来麻烦)。

或者,任何其他解决问题的方法,也许使用我不知道的内置 box2d 功能。

【问题讨论】:

  • 您可以将其简化为线/圆相交问题。您可以将两个移动的圆圈视为一个对角线移动的圆圈(移动您的参考系,使一个圆圈静止)。然后你想知道中心何时比r1+r2 更近。嗯,这只是一个更大的圆,半径为r1+r2,而移动圆的中心在一条线上移动。因此,线/圆相交问题。
  • 有趣的方法。时间因素必须被纳入,因为它是一个预测。因此,如果说,一个更大的圆 (r1+r2) 沿 x 轴移动,而一条线,或者更确切地说,一个点沿 y 轴移动,那么我将不得不找到 t1 和 t2 - 当圆的最右边和最左边的边缘(circle.x+r 和 circle.x-r)穿过 Point.x,然后找到 t3 - Point.y 穿过 Circle.y(中心)的时间,如果 t3 落在 t1 和 t2 之间那么这意味着会有碰撞。我在正确的轨道上吗?这真的相当于一个圆圈预测吗?我不完全确定。
  • 如果你知道所有东西的坐标(起点和两个交点)和运动部件的速度,那么你可以用公式v = d/t计算时间。顺便说一句,当我说“线/圆相交问题”时,线和圆都没有移动。这是一个纯代数问题。重点是将您的移动形状问题减少为静态不移动问题,这更容易推理。
  • 是的,所有坐标都是已知的,我使用速度和距离来检索时间。这不是一个静态问题,因为它处理未来的交叉点并且对象必须移动。时间是一个因素。解决此问题的一种方法是模拟 box2d 世界及时向前移动并查看是否发生交叉。但这会对性能造成负担,而且问题很简单,可以用另一种方式解决。我尝试了点圆方式 - 得到不一致的结果。
  • 您的速度是否恒定?如果是这样,那么它确实成为一个静态问题。我知道你想要未来的交点时间,但是这个方法让你在不模拟任何东西的情况下计算它——这都是数学。

标签: java libgdx box2d linear-algebra collision


【解决方案1】:

公认的解决方案缺少一些东西。为了解决这个方程:

x = (−b ± sqrt(b^2 - 4ac)) / 2a

这意味着:

x1 = (−b + sqrt(b^2 - 4ac)) / 2ax2 = (−b - sqrt(b^2 - 4ac)) / 2a

至少 x1 或 x2 需要肯定才能正确检测到碰撞。如果两者都是负数,则不会发生碰撞。

【讨论】:

  • 在我的游戏中进行预测时,球的位置和速度使得碰撞只能在未来发生,因此上述计算有效。一般来说,你是对的。为了使检测在所有情况下都是正确的,必须检查 t 的符号。我更新了答案。谢谢。
【解决方案2】:

好吧,我想出了如何求解 t 的方程。

(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)

更新:

正如 Moe Amin Allani 敏锐地观察到的那样,至少有一个 t 解必须是正数,才能检测到未来的碰撞,而不是据称更早发生的碰撞。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多