我为了好玩而写了一个简单的物理系统,我遇到了一个让我陷入困境的问题。
现在的基本算法是:
我有一个移动的身体向两个移动,静止的,无质量的,身体。

移动的物体一步一步地被转换成与其中一个物体碰撞。

我的反应是找到我能移动的最小距离,这样它们就不再碰撞了。在这种情况下,这意味着将动态物体直接向下移动。然而,现在它正与另一个盒子相撞。

我对这个盒子重复同样的事情,试图移动这个动态的盒子,这样它就不再碰撞了,但是这把它推回到了第一个盒子里。这会永远重复。我的算法有根本缺陷吗?
发布于 2013-09-03 11:36:44
与其在检测到碰撞后向下移动,不如将移回来自的方向。这样,您就可以保证,如果我们假设初始状态没有冲突,则最终必须处于没有冲突的状态。
我们需要通过缩小(缩放) 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是较小的交点,那么我们通过y_intersection / v_y缩放v,然后通过-v * y_intersection / v_y = -(y_intersection * v_x/v_y, y_intersection)将对象向后移动。
所以我想说你算法中的步骤可能是:
v移动对象- For all collision objects find the minimum scaling of `v` by which we we would need to move back. This scaling can be computed as the minimum of two ratios给定v= (v_x,v_y) min_i = min(x_intersection / v_x,y_intersection / v_y) --找到所有对象的最小比例。
min_o = min(min_i)表示所有i
-用最小比缩放负移动方向得到的物体向后移动。这就是v2 = (min_o*-v),v2是我们用来向后移动的向量。
例如:第一个选择w

然后选择u2

已完成:

发布于 2013-09-02 18:58:49
对于您描述的问题(完全未经测试),可能有一个可能的解决方案:
dt。t_col < dt的时间。t_col移动对象,使其准确地击中对象,然后开始翻转速度和其他与碰撞有关的物理。现在,您可以在这里完成这一步,如果您懒惰(可能是好的,因为dt应该很小),或者继续移动另一个dt - t_col,看看您是否碰到了其他的东西。这不是我刚刚发明的东西,但是类似于Simulink用来模拟这种不连续问题的零交叉检测。
https://stackoverflow.com/questions/18578656
复制相似问题