【发布时间】: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