一旦检测到碰撞,与其向下移动,不如向原来的方向移动。这样你就可以保证,如果我们假设初始状态没有冲突,那么最终你必须处于没有冲突的状态。
我们需要找出我们需要缩小(缩放)多少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)
。
所以我想说你的算法中的步骤可能是:
- 通过一些移动向量移动对象
v
- 检查所有碰撞
如果发生碰撞
对于所有碰撞对象,找到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
用来向后移动的向量。
- 返回第 2 步
例如:第一个选择w
:
然后选择u2
:
完毕 :