我正在编写一个简单的物理系统来娱乐,但我遇到了一个让我陷入困境的问题。
现在的基本算法是:
- 移动物体
- 检查是否有碰撞
- If there was a collision
- 将对象移动最小距离以解决碰撞。
- 根据法线、质量等调整速度
我有一个移动的物体朝着两个静止的、无质量的物体移动。
移动物体一步平移以与其中一个物体碰撞。
我的反应是找到我可以移动的最小距离,这样它们就不再碰撞。在这种情况下,这意味着将动态主体垂直向下移动。然而,现在它正在与另一个盒子相撞。
我对那个盒子重复同样的事情,尝试移动动态盒子,使其不再碰撞,但这会将它推回到第一个盒子中。这会永远重复。我的算法有根本缺陷吗?
一旦检测到碰撞,最好不要向下移动朝你来的方向走回。这样,如果我们假设初始状态没有碰撞,那么您可以保证最终您一定会处于没有碰撞的状态。
我们需要找出需要缩小多少(缩放)v
使其适合对象交集。缩小了的v
将具有正确的大小,因此如果我们朝-v
到了这个程度,我们就不再相交了。
假设一个交集由一个x_intersection
and a y_intersection
成分。为了找出我们需要向后移动多少才能不再相交,我们需要缩放原始尺寸v = (v_x, v_y)
向量。如果x_intersection
是较小的交集然后我们缩放v
by x_intersection / v_x
并将我们的对象向后移动-v * x_intersection / v_x
。这意味着我们向后移动-(x_intersection, x_intersection * v_y/v_x)
。如果y_intersection
是较小的交集然后我们缩放v
by 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)
where v2
是我们用来向后移动的向量。
- 返回步骤 2
例如:第一选择w
:
然后选择u2
:
Done :
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)