如果之前发布过,我很抱歉。我无法通过Stackoverflow找到有关该主题的任何内容,也无法通过我的其他任何谷歌搜索找到。
我有两个物体,都包含位置(x和y),以及线速度(x和y)。这些物体正在通过2d平面移动。我需要检测这些物体何时碰撞,如果它们会发生碰撞。对我来说,最大的问题是物体的半径,因为这会在它们碰到时产生影响。
我已经在一个月的时间内尝试了解决这个问题的各种方法,但我还没有破解它。我设法做的是计算对象的两个直线公式,最后得到两者的b和c(y = mx + c)。我试图将这两个公式相互比较,其中x = x和y = y,但最终得到一个非常复杂的公式,并且不知道如何将其转换为c#。
此功能也需要在<50ms内触发,使问题复杂化。任何建议都会有很长的路要走。
答案 0 :(得分:7)
您可以将问题表示为两个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
值的事实?请考虑以下图像:
正如您所看到的,我们获得了第一次接触,&#34;条目&#34;的解决方案,以及当对象相交和分开时,&#34;退出&#34;。根据您的需要,这可能很有用,但如果您只需要联系时间,请选择较小的t
。