碰撞检测 - 订购 - 哪个碰撞首先发生?

时间:2015-04-19 11:00:59

标签: language-agnostic 2d collision-detection physics-engine aabb

所以我制作的物理引擎只使用矩形(轴对齐的边界框)作为形状。我已经实现了一个来自christer ericsons book的方法,该方法返回两个移动的aabbs的碰撞时间和法线。我还制作了另一种方法,它需要两个速度,位置和一个响应碰撞的法线,并给出了新的速度。

现在的实际问题是,我不知道如何检查所有aabbs之间的碰撞并响应它们的循环应该是这样的。简单地说,我不知道如何在碰撞时订购碰撞,以及我应该回应哪些碰撞。

用伪代码编写的循环显示如何排序所有碰撞将非常有用。

我提到的另一件事是,如果它的速度真的很高,那么移动的盒子可以在一个帧中在两个静态盒子之间反弹数百次,你怎么处理是什么?

1 个答案:

答案 0 :(得分:0)

您应该让一个简单的优先级队列来处理正确的执行顺序。从概念上讲,这最终会看起来像这样:

queue<CollisionEvent> q = new empty queue
while (!q.isEmpty) {
  nextCollision = q.dequeueMinimum
  /* run animation until nextCollision.time 
     ...
  */
  newMovingParticles = nextCollision.movingParticles
  newCollisions = computeCollisionEvents(newMovingParticles, allOtherParticles);
  for each event in newCollisions {
    q.enqueue(event, event.time);
  }
}

快速移动的盒子怎么样:我不知道。在物理上,仅仅接受可能发生的事件是有一系列非常频繁的碰撞事件是有意义的。我无法解释为什么,但由于某种原因,我不期望任何无限循环或zeno类型问题。我宁愿期望即使是非常重的箱子与非常轻的箱子的正面碰撞,灯箱被困在重箱子和墙壁之间,以有限的多步结束。这就是刚体僵硬的原因,我认为应该接受这个作为一个特征。