从粗到细碰撞检测 - 同一对象上的多次碰撞

时间:2012-09-01 19:30:56

标签: c++ data-structures collision-detection physics simulation

我目前正致力于碰撞检测算法,其具有广泛的相位以检测可能的碰撞,并且精确的相位用于确定性地解决碰撞。 广泛阶段基于分层哈希网格并且表现良好。

精细阶段基于自定义算法,正在使用 n-body collisions 。为了准确地解决2个以上的碰撞,我需要以某种方式记录碰撞集中的所有碰撞和相应的元素。

在广泛阶段以某种方式保存碰撞的最佳方法是什么才能在精细阶段遍历碰撞集?我正在考虑某些数据结构,但我还没有想出一个理想的解决方案。

2 个答案:

答案 0 :(得分:0)

看起来这篇论文的技术并不适用于对性能至关重要的情况。

似乎该技术试图解决一个对象可以“传送”到另一个对象的另一侧而不会发生碰撞的情况,因为模拟中的移动对象通常只是在每次迭代中重新定位。

我建议改为将每个对象挤出自上次更新以来所经过的任何空间。例如,一个向上移动的盒子会变成一个更高的盒子。

然后,您可以快速检测潜在的碰撞,而无需考虑运动甚至更新速率。然后可以根据需要仔细检查潜在的碰撞。

答案 1 :(得分:0)

我目前的做法

在考虑了问题之后,我决定尝试以下方法。

  • 碰撞集是元素的向量
  • 碰撞集本身存储在列表中
  • 每个元素都指向在hashmap中设置的碰撞

如果现在在广泛阶段检测到碰撞:

  1. 如果两个元素都不是hashmap中的键:
    • 为碰撞集
    • 创建了一个新向量
    • 两个元素都添加到碰撞集
    • 将碰撞集添加到碰撞列表
    • 将两个元素作为碰撞集的键
    • 插入到散列映射中
  2. 如果一个元素是hashmap中的键:
    • 通过该元素检索碰撞集
    • 将另一个元素添加到碰撞集
    • 将另一个元素作为碰撞集的键
    • 插入到散列映射中
  3. 如果两个元素都是hashmap中的键:
    • 如果他们都指向相同的碰撞集,那就没关系
    • 如果他们指向不同的碰撞集
      • 创建新的碰撞集矢量
      • 将两个碰撞集复制到新的colision集
      • 从碰撞列表中删除两个碰撞集
      • 将新的碰撞集添加到碰撞列表
      • 遍历新的碰撞集并在每个元素的hashmap中更新引用
  4. 在精确阶段,我现在可以简单地迭代碰撞列表中的所有碰撞集并进行精确的碰撞解决。

    解决方案相当快,但我有点担心内存占用。我将不得不做几个基准来了解更多。