【问题标题】:Collision Detection - Ordering - Which collision goes first?碰撞检测 - 排序 - 哪个碰撞先发生?
【发布时间】:2015-06-26 01:26:16
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 由于在冲突检测这一主题上没有多少程序员,请问您是否有类似 Skype 或 facebook 之类的东西,我可以像在聊天中那样与您联系?我用javascript编写代码,所以psuedo仍然让我有点困惑。例如 enqueue 函数是什么意思?
    • 这不是真正的“伪代码”(无论它是什么意思),而只是“通用 c++/java-esque”代码。队列是一种先进先出的数据结构。您在这里需要的队列是允许按优先级插入元素的队列。 enqueuedequeuequeue 数据结构支持的基本操作。我既不是物理引擎专家,也不是 javascript 专家。但是,您可能想提出您的问题的更扩展版本,可能带有一些可运行的代码(可能将其托管在 github 上?),以便真正有一些东西可以使用,也许有人会仔细看看。
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多