use*_*528 5 algorithm physics collision
为了好玩,我正在编写一个简单的物理系统,但遇到了一个让我陷入困境的问题。
现在的基本算法是:
我有一个移动的物体向两个静止的、无质量的物体移动。

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

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

我对那个盒子重复同样的事情,试图移动动态盒子,使其不再发生碰撞,但这会将它推回到第一个盒子中。这将永远重复。我的算法从根本上有缺陷吗?
一旦检测到碰撞,与其向下移动,不如沿您来时的方向向后移动。这样你就可以保证,如果我们假设初始状态没有碰撞,最终你必须处于没有碰撞的状态。
我们需要找出需要缩小(缩放)多少v才能使其适合对象交集。收缩v将具有正确的大小,因此如果我们向后移动-v那个大小的方向,那么我们将不再相交。
让我们假设一个交集由 ax_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)。
所以我会说你的算法中的步骤可能是:
v如果发生碰撞
对于所有碰撞对象,找到v我们需要向后移动的最小缩放比例。这种缩放可以计算为两个比率中的最小值
given v = (v_x, v_y)
min_i = min(x_intersection / v_x, y_intersection / v_y)
Run Code Online (Sandbox Code Playgroud)找出所有对象的最小缩放比例。
min_o = min(min_i) for all i
Run Code Online (Sandbox Code Playgroud)通过以最小比率缩放负移动方向获得的矢量方向将对象移回。这就是v2 = (min_o*-v)这里v2是我们用来回迁的载体。
例如:首选w:

然后选择u2:

完毕 :

一种可能的解决方案可能对您描述的问题有效(完全未经测试):
将对象移动一个完整的时间步长dt
检查是否与其他对象发生碰撞,这可能是多个对象
通过插值计算“影响时间”,它是小于时间步长的实数。对碰撞的每个对象执行此操作,然后选择最小的一个。这使您有时间进行第一次碰撞t_col < dt。
重做最后一步,但现在仅移动对象,t_col使其精确撞击对象,然后开始翻转速度和其他与碰撞相关的物理特性。如果你很懒的话,你现在可以完成这里的步骤(可能没问题,因为dt应该很小),或者继续移动另一个步骤dt - t_col,看看是否碰到了其他东西。
这不是我刚才发明的,而是类似于Simulink用来精确模拟此类不连续问题的过零检测。