5

我正在编写一个简单的物理系统来娱乐,但我遇到了一个让我陷入困境的问题。

现在的基本算法是:

  1. 移动对象
  2. 检查碰撞
  3. 如果发生碰撞
    • 将对象移动最小距离以解决碰撞。
    • 根据法线、质量等调整速度

我有一个移动的物体向两个静止的、无质量的物体移动。

图一

移动物体一步平移以与其中一个物体发生碰撞。

图二

我的回应是找到我可以移动的最小距离,这样它们就不会再发生碰撞。在这种情况下,这意味着将动态主体直接向下移动。然而,现在它正在与另一个盒子发生碰撞。

图三

我对那个盒子重复同样的事情,试图移动动态盒子,使其不再碰撞,但这会将它推回第一个盒子。这永远重复。我的算法是否存在根本缺陷?

4

2 回答 2

5

一旦检测到碰撞,与其向下移动,不如向原来的方向移动。这样你就可以保证,如果我们假设初始状态没有冲突,那么最终你必须处于没有冲突的状态。

我们需要找出我们需要缩小(缩放)多少v以使其适合对象交集。收缩v将具有正确的大小,因此,如果我们沿该大小的方向向后移动-v,那么我们将不再相交。

让我们假设一个交集由一个x_intersection和一个y_intersection组件组成。要找出我们需要向后移动多少才能不再相交,我们需要缩放原始v = (v_x, v_y)向量。如果x_intersection是较小的交点,那么我们v按比例缩放x_intersection / v_x并将我们的对象向后移动-v * x_intersection / v_x。这意味着我们向后移动-(x_intersection, x_intersection * v_y/v_x)。如果y_intersection是较小的交点,那么我们v按比例缩放y_intersection / v_y并将我们的对象向后移动-v * y_intersection / v_y = -(y_intersection * v_x/v_y, y_intersection)

所以我想说你的算法中的步骤可能是:

  1. 通过一些移动向量移动对象v
  2. 检查所有碰撞
  3. 如果发生碰撞

    • 对于所有碰撞对象,找到v我们需要向后移动的最小缩放比例。这种缩放可以计算为两个比率的最小值

      given v = (v_x, v_y)
      min_i = min(x_intersection / v_x, y_intersection / v_y)    
      
    • 找到所有对象的最小缩放比例。

      min_o = min(min_i) for all i
      
    • 通过以最小比例缩放负移动方向获得的矢量方向将对象向后移动。那就是v2 = (min_o*-v)我们v2用来向后移动的向量。

  4. 返回第 2 步

例如:第一个选择w

w

然后选择u2

u2

完毕 :

在此处输入图像描述

于 2013-09-03T11:36:44.313 回答
2

一种可能的解决方案可能对您描述的问题很有效(完全未经测试):

  1. 将您的对象移动一个完整的时间步长dt

  2. 检查与其他对象的碰撞,这可能不止一个对象

  3. 通过插值计算“影响时间”,这是一个小于时间步长的实数。对您碰撞的每个对象执行此操作,然后选择最小的一个。这为您提供了第一次碰撞的时间t_col < dt

  4. 重做最后一步,但现在仅移动对象以t_col使其准确地撞击对象,然后开始翻转速度和其他与碰撞相关的物理。如果你很懒惰,你现在可以完成这里的步骤(可能没问题,因为dt应该很小),或者继续移动另一个dt - t_col,看看你是否碰到了别的东西。

这不是我刚刚发明的东西,而是类似于Simulink 用来精确模拟这种不连续问题的过零检测。

于 2013-09-02T18:58:49.617 回答