0

所以我正在制作一个只使用矩形(轴对齐的边界框)作为形状的物理引擎。我已经实现了克里斯特爱立信书中的一个方法,该方法返回两个移动 aabbs 的碰撞时间和法线。我还提出了另一种方法,它采用两个 aabbs 速度、位置和一个响应碰撞并赋予 aabbs 新速度的法线。

现在的实际问题是,我不知道检查所有 aabbs 之间的冲突并响应它们的循环应该是什么样子。只是我不明白如何按撞击时间排序碰撞,以及我应该响应哪个碰撞。

用伪代码编写的循环显示如何对所有冲突进行排序将非常有帮助。

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

4

1 回答 1

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 类型问题。我宁愿期望即使是非常重的盒子与非常轻的盒子的正面碰撞,其中灯箱被困在沉重的盒子和墙壁之间,也会以有限的步数结束。这就是使刚体变得刚性的原因,我认为应该将其作为一个特征来接受。

于 2015-04-19T11:25:45.557 回答