检测经历多次转换的两个实体之间的碰撞

时间:2019-02-05 22:58:32

标签: collision-detection game-physics physics

很长时间以来,我一直在寻找答案,但是到目前为止,我还没有找到任何明确的答案。我要做的是确定两个身体在时间t0t1之间是否碰撞以及何时碰撞。如果每个物体只是平移或旋转(围绕中心或任何点),则计算该值将更直接,但是在彼此之上添加多个变换时,事情会变得更加混乱。我制作了这个动画来说明问题。

Animation

如您所见,有时t0t1不会发生冲突,但是在它们之间会发生多次冲突。

我想到的解决此问题的一种方法是减小时间间隔的大小。因此,在t0t1之间,将总共进行n个更新以检查冲突。这行得通,但我发现无法保证不会出现假阴性(即找不到发生的碰撞)的唯一方法是在极短的时间范围内进行积分。您可以想象,这是非常昂贵的,因为它导致每个更新周期每个主体数十到数百个时间步长。我并不是说这个想法没有任何价值,但我需要找到一种方法来计算最小时间步长,而不是将每个物体均匀地向前移动一个距离/旋转单位,直到它们到达所需的位置和方向。< / p>

所以,我的问题分为两个部分:

  1. 是否有更好的方法来确定是否以及何时发生碰撞?
  2. 如果没有,是否可以计算最小时间步长?

1 个答案:

答案 0 :(得分:0)

我怀疑这个问题能否总体解决。如果我们将时间视为第三个空间轴,则问题等同于找到在时间 t_1 t_2 之间由两个形状的轮廓所跟踪的物体之间的任何交点。最好的方法(最准确的方法)可能是使用较小的时间步长,并考虑在时间 t_m t_(m + 1)之间跨越的任何两个3d“切片”之间的交集。我>。但这并不会比只考虑2d数字好得多。

关于第二部分,可能没有,但是也许您可以通过一个时间步长迭代模拟,该时间步长取决于两个图形之间的最近距离以及该距离的变化速度?这可能会提高准确性和处理速度,但仍不能保证找到所有相交点。

如果这样做的话,我会建议一个时间步长 dt 之类的

dt = Min(f * d / Max(-v,v_min),DT),其中

DT是您允许的最大时间步长

d是图中最近的点之间的距离

v是该距离变化的速度(如果彼此接近,则为负),

v_min是您认为对模型逼真的最低(正)速度,

f一定要小于1,以最大程度地减少两个物体之间突然的“跳跃”速度所产生的误报。

最后,您可以围绕图形的旋转点建模一些圆,并在圆不相交的情况下安全地移动图形(您只需平移圆,因为它们在旋转下是不变的),那么您可以只要这些圆圈相交,就使用小的时间步长。

我希望其中的一些帮助。