为了好玩,我正在编写一个简单的物理系统,但遇到了一个让我卡住的问题。
现在的基本算法是:
- 移动一个对象
- 检查碰撞
- 如果发生碰撞
- 将对象移动最小距离以解决碰撞。
- 根据法线、质量等调整速度
我有一个移动的物体向两个静止的、无质量的物体移动。
移动的物体被平移一步与其中一个物体碰撞。
我的回应是找到我可以移动的最小距离,这样它们就不会再发生碰撞。在这种情况下,这意味着直接向下移动动态主体。然而,现在它正在与另一个盒子发生碰撞。
我对那个盒子重复同样的事情,尝试移动动态盒子,使其不再碰撞,但将它推回第一个盒子。这永远重复。我的算法是否存在根本性缺陷?
最佳答案
与其在检测到碰撞后向下移动,不如向原方向移动。这样你就可以保证,如果我们假设初始状态没有碰撞,最终你必须处于没有碰撞的状态。
我们需要找出我们需要缩小(缩放)v
以使其适合对象交集的程度。缩小的 v
将具有正确的大小,因此如果我们在 -v
的方向上向后移动该大小,那么我们将不再相交。
假设一个路口由一个 x_intersection
和一个 y_intersection
组件组成。为了找出我们需要向后移动多少才能不再相交,我们需要缩放原始 v = (v_x, v_y)
向量。如果 x_intersection
是较小的交叉点,那么我们按 x_intersection/v_x
缩放 v
并按 -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
:
完成:
关于algorithm - 多个物体之间的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578656/