【发布时间】:2013-01-24 18:59:21
【问题描述】:
在谨慎的时间里,我有 2 个球,它们的位置是通过数值方法确定的。
测试碰撞只是 (d 确定碰撞的时间,这样我就可以获得碰撞发生时的法线向量并应用适当的碰撞响应
如果它只有 2 个点会很容易,但球有半径。我必须及时线性插值以找到它们碰撞的确切时间。
我知道球在当前时间步的位置和速度
如果时间步长很小,我可以使用线性近似来获取先前的位置并使用它来获取碰撞点,这样我就可以给它一个适当的碰撞响应
碰撞的时间是满足 (d = r1 + r2) 的时候,扩展这个方程,我们得到
(P1 - tV1) - (P2 - tV2) = N (r1 + r2),P's 是球的中心位置,V's 是速度,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 小于步长
但这是一个非常复杂的解决方案,没有更简单的方法来解决这个问题吗?
【问题讨论】:
-
为什么这么复杂?它通过对每一对计算
O(1)来解决问题。没有渐近更快的解决方案。 -
您的问题似乎与编程没有直接关系,因此似乎与 Stack Overflow 无关。关于数学的问题最好在我们的姊妹网站math.stackexchange.com提出。