找到球体之间的碰撞点

时间:2013-01-24 18:59:22

标签: math collision-detection

在谨慎的时间里,我有2个球,其位置由数值方法确定。

碰撞测试只是(d 确定碰撞时间的影响,这样我就可以在发生碰撞时获得正常的矢量并应用适当的碰撞响应< - 这个过程很耗费,有​​一种更简单的方法解决这个问题?像某种近似来简化计算?

如果它只有2个点就很容易,但球有半径。我必须及时进行线性插值,以找到它们碰撞的确切时间。

我知道当前时间步中球的位置和速度

如果时间步长是小的enoguh,我可以使用线性近似来获得先前的位置并使用它来获得碰撞点,这样我就可以给它一个适当的碰撞响应

当碰撞时间(d = r1 + r2)满足时,扩展此等式,我们得到

(P1-tV1) - (P2-tV2)= N(r1 + r2),P是球的中心位置,V是速度,N是从球1指向球2的法线向量。

收集条款,(P1 - P2) - t(V1 - V2)= N(r1 + r2)

我们可以在两边摆脱N点数产品,但是这对于所有的正方形和东西来说都是非常难以实现的。

让(Px,Py)= P1 - P2,V相同,然后在两边执行点积

我们得到(Px - tVx)^ 2 +(Px - tVx)^ 2 =(r1 + r2)^ 2,为了解决t,我们需要扩展它

Px ^ 2 + Py ^ 2 - t(2Vx + 2Vy)+ t ^ 2(Vx ^ 2 + Vy ^ 2)=(r1 + r2)^ 2

t ^ 2(Vx ^ 2 + Vy ^ 2) - t(2Vx + 2Vy)+(Px ^ 2 + Py ^ 2 - (r1 + r2)^ 2)= 0

可以用二次解算器求解at ^ 2 + bt + c = 0,我们知道t小于步长

但这是一个非常复杂的解决方案,有没有更简单的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果在每个时间步长没有对球体施加加速度,这在时间步长很小的情况下是合理的,那么例如:如果在t_start处d = r1 + r2 + A,在t_end处d = r1 + r2-B,通过时间步长发生碰撞A /(B + A)。

然后可以根据速度矢量V1和V2轻松计算该碰撞的坐标。