与多个对撞机碰撞后find新的位置

什么是最准确的方法find正确的位置,移动的角色应该被重新定位为碰撞分辨率,在它与多个碰撞体发生碰撞后?

下图说明了这种情况。 黑色的长方形是墙壁,蓝色的长方形/圆形是移动的字符,而读取的箭头表示移动的方向,即在这种情况下从右到左。 我的设置是2D,我在Unity中使用C#。

在这里输入图像描述

在我的角色引发的手榴弹冲突物理定义中,我遇到了类似的问题。 我find了一个可以满足您需求的解决scheme。

当一个物体(例如一个小球)沿着它的轨迹移动时,无论是否受重力影响,每一帧都会从点A移动到点B(取决于你希望的帧率,你必须处理三角时序),给我们一个暗示它的速度。 如果从A移动到B时没有发生碰撞,则根据运动学(图像中的第一种情况),将球放在新的位置。

在这里输入图像描述

如果至less有一次碰撞被发现,我们会发现一个位置C(我们不介意它是一个2D还是3D模型 – 它的工作原理是一样的),这是沿vectorAB的最终位置,我们的球不与其他任何东西碰撞。 虽然距离我们有一小段距离,但是我们的球应该是AB距离的,但是实际上是AC距离,这是较小的(图中的第二个例子)。 然后我们计算两个值:剩下的距离(CB = AB – AC,当使用xy值时,您只需应用Phythagoras定理)以及我们球移动的新方向。

如果从A到B的运动是由一个脚本来计算的(情况1),那么首先在AC上然后在CB(图2)上迭代它将使球仍然按照碰撞检测行进到AB距离。 在同一条path上有更多的碰撞点不是什么大不了的,我们只是按照我们的需要迭代我们的移动脚本三,四,五次。 您可以制作此algorithm的迭代或recursion版本。

在我的个人项目中,我使用了一个迭代脚本,按顺序执行以下操作:

  1. 如果AB> 0,检查A和B之间的冲突
  2. 如果未检测到碰撞,请将物体移动到位置B.
  3. 如果检测到碰撞,find点C并移动点C中的对象
  4. 计算距离CB和新的方向角 (下标为这个)
  5. 回到1使用新的距离和新的方向角度

希望有所帮助。

编辑:如果你的对象在同一时间与两个着名的对象发生碰撞,那么把新的方向角度作为你计算的两个假设角度的vector和。