两个物体在什么增量时间发生碰撞?
At what delta time will two objects collide?
如果之前有人发布过,我深表歉意。我似乎无法通过 Whosebug 或我的任何其他 google 搜索找到关于该主题的任何内容。
我有两个对象,都包含一个位置(x 和 y),以及一个线速度(x 和 y)。这些对象正在通过二维平面移动。我需要检测这些对象何时会发生碰撞,是否会发生碰撞。我的情况最大的问题是物体的半径,因为这会在它们接触时产生影响。
在一个月的时间里,我尝试了各种解决方案来解决这个问题,但我就是没有破解它。我设法做的是计算对象的两个直线公式,最后得到两个 (y=mx + c) 的 b 和 c。我试图将这两个公式相互比较,其中 x=x 和 y=y,但最终得到一个非常复杂的方程式,并且不知道如何将其转换为 c#。
此函数也需要在 <50 毫秒内触发,这会使事情复杂化。任何建议都会有很长的路要走。
您可以将问题表述为两个 vector 方程组
p1 = u1 + v1 t
p2 = u2 + v2 t
其中 p1
是给定初始位置 u1
、速度 v1
和 scalar 时间 t
的第一个对象的位置。我们想解决物体刚刚接触的那一刻,描述为
r1 + r2 = |p1 - p2|
其中 r1
和 r2
是物体的半径。让我们定义一些变量,这样我们的推导就更清晰了:
x = u1.x - u2.x
y = u1.y - u2.y
x' = v1.x - v2.x
y' = v1.y - v2.y
那么我们可以进行如下求解:
r1 + r2 = |p1 - p2|
= sqrt((p1.x - p2.x)^2 + (p1.y - p2.y)^2) definition of vector magnitude
=> (r1 + r2)^2 = (p1.x - p2.x)^2 + (p1.y - p2.y)^2 square both sides
= (x + x' t)^2 + (y + y' t)^2 substitute variable definitions
= x^2 + 2 x x' t + x'^2 t^2 + y^2 + 2 y y' t + y'^2 t^2 expand squares of sums
= (x'^2 + y'^2) t^2 + 2 (x x' + y y') t + x^2 + y^2 rearrange terms
=> (x'^2 + y'^2) t^2 + 2 (x x' + y y') t + x^2 + y^2 - (r1 + r2)^2 = 0 rearrange terms
这是一个二次方程,所以我们可以使用 quadratic formula 和
求出 t
a = x'^2 + y'^2
b = 2 (x x' + y y')
c = x^2 + y^2 - (r1 + r2)^2
如果物体不发生碰撞,discriminant b^2 - 4 a c
将为负数。如果对象过去发生碰撞,则 t
的值可能为负。
说到这里,我们如何解释我们得到了两个根,或者说 t
的两个值?考虑下图:
如您所见,我们获得了第一次接触的解决方案,"entry",以及对象相交和分开的解决方案,"exit"。根据您的需要,这可能会有用,但如果您只需要联系时间,请选择较小的 t
。
如果之前有人发布过,我深表歉意。我似乎无法通过 Whosebug 或我的任何其他 google 搜索找到关于该主题的任何内容。
我有两个对象,都包含一个位置(x 和 y),以及一个线速度(x 和 y)。这些对象正在通过二维平面移动。我需要检测这些对象何时会发生碰撞,是否会发生碰撞。我的情况最大的问题是物体的半径,因为这会在它们接触时产生影响。
在一个月的时间里,我尝试了各种解决方案来解决这个问题,但我就是没有破解它。我设法做的是计算对象的两个直线公式,最后得到两个 (y=mx + c) 的 b 和 c。我试图将这两个公式相互比较,其中 x=x 和 y=y,但最终得到一个非常复杂的方程式,并且不知道如何将其转换为 c#。
此函数也需要在 <50 毫秒内触发,这会使事情复杂化。任何建议都会有很长的路要走。
您可以将问题表述为两个 vector 方程组
p1 = u1 + v1 t
p2 = u2 + v2 t
其中 p1
是给定初始位置 u1
、速度 v1
和 scalar 时间 t
的第一个对象的位置。我们想解决物体刚刚接触的那一刻,描述为
r1 + r2 = |p1 - p2|
其中 r1
和 r2
是物体的半径。让我们定义一些变量,这样我们的推导就更清晰了:
x = u1.x - u2.x
y = u1.y - u2.y
x' = v1.x - v2.x
y' = v1.y - v2.y
那么我们可以进行如下求解:
r1 + r2 = |p1 - p2|
= sqrt((p1.x - p2.x)^2 + (p1.y - p2.y)^2) definition of vector magnitude
=> (r1 + r2)^2 = (p1.x - p2.x)^2 + (p1.y - p2.y)^2 square both sides
= (x + x' t)^2 + (y + y' t)^2 substitute variable definitions
= x^2 + 2 x x' t + x'^2 t^2 + y^2 + 2 y y' t + y'^2 t^2 expand squares of sums
= (x'^2 + y'^2) t^2 + 2 (x x' + y y') t + x^2 + y^2 rearrange terms
=> (x'^2 + y'^2) t^2 + 2 (x x' + y y') t + x^2 + y^2 - (r1 + r2)^2 = 0 rearrange terms
这是一个二次方程,所以我们可以使用 quadratic formula 和
求出t
a = x'^2 + y'^2
b = 2 (x x' + y y')
c = x^2 + y^2 - (r1 + r2)^2
如果物体不发生碰撞,discriminant b^2 - 4 a c
将为负数。如果对象过去发生碰撞,则 t
的值可能为负。
说到这里,我们如何解释我们得到了两个根,或者说 t
的两个值?考虑下图:
如您所见,我们获得了第一次接触的解决方案,"entry",以及对象相交和分开的解决方案,"exit"。根据您的需要,这可能会有用,但如果您只需要联系时间,请选择较小的 t
。