algorithm - 多个物体之间的碰撞

标签 algorithm physics collision

为了好玩,我正在编写一个简单的物理系统,但遇到了一个让我卡住的问题。

现在的基本算法是:

  1. 移动一个对象
  2. 检查碰撞
  3. 如果发生碰撞
    • 将对象移动最小距离以解决碰撞。
    • 根据法线、质量等调整速度

我有一个移动的物体向两个静止的、无质量的物体移动。

Figure One

移动的物体被平移一步与其中一个物体碰撞。

Figure Two

我的回应是找到我可以移动的最小距离,这样它们就不会再发生碰撞。在这种情况下,这意味着直接向下移动动态主体。然而,现在它正在与另一个盒子发生碰撞。

Figure Three

我对那个盒子重复同样的事情,尝试移动动态盒子,使其不再碰撞,但将它推回第一个盒子。这永远重复。我的算法是否存在根本性缺陷?

最佳答案

与其在检测到碰撞后向下移动,不如向原方向移动。这样你就可以保证,如果我们假设初始状态没有碰撞,最终你必须处于没有碰撞的状态。

我们需要找出我们需要缩小(缩放)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)

所以我想说您的算法中的步骤可能是:

  1. 通过一些移动向量移动对象 v
  2. 检查所有碰撞
  3. 如果发生碰撞

    • 对于所有碰撞对象,找到我们需要向后移动的 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 是我们用来向后移动的向量。

  4. 回到第2步

例如:先选择w:

w

然后选择u2:

u2

完成:

enter image description here

关于algorithm - 多个物体之间的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578656/

相关文章:

python - 在常数时间内找到堆栈中的最小元素

iphone - 当球撞击轨道时如何获得碰撞效果或弹力

flash - 防止box2d播放器在半空中压在墙上

python - 如何判断贪吃蛇游戏中的蛇是否穿过了食物?

algorithm - 贝尔曼-福特 vs 迪杰斯特拉 : Under what circumstances is Bellman-Ford better?

c# - 我有一个充满照片网址的 n x n 网格。如何确保照片不会一起出现在 c# 中

ios - SceneKit物理接触

c++ - Collision c++ 2d 游戏,防止玩家进入瓷砖

ruby-on-rails - 如何解决 Rails 模型 namespace 冲突

java - 将表达式从前缀转换为后缀(面临优先问题)