0

我目前正在研究一种碰撞检测算法,该算法具有广泛的阶段来检测可能的碰撞,而精细的阶段则可以确定性地解决碰撞。广泛阶段基于分层哈希网格并且表现良好。

精细阶段基于自定义算法并使用n-body 碰撞。但是,为了准确解决多于 2 体的碰撞,我需要以某种方式注册所有碰撞和碰撞集中的相应元素。

在广泛阶段以某种方式保存碰撞迭代精细阶段中的碰撞集的最佳方法是什么?我一直在思考某些数据结构的思路,但我还没有想出一个理想的解决方案。

4

2 回答 2

0

看起来该论文的技术不适用于性能关键的情况。

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

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

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

于 2012-09-01T19:58:05.900 回答
0

我目前的做法

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

  • 碰撞集是元素的向量
  • 碰撞集本身存储在一个列表中
  • 每个元素都指向其在 hashmap 中的冲突集

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

  1. 如果两个元素都不是哈希图中的键:
    • 为碰撞集创建一个新向量
    • 两个元素都添加到碰撞集中
    • 碰撞集被添加到碰撞列表中
    • 两个元素都作为冲突集的键插入到哈希图中
  2. 如果一个元素是哈希图中的键:
    • 通过该元素检索碰撞集
    • 另一个元素被添加到碰撞集中
    • 另一个元素作为冲突集的键插入到 hashmap 中
  3. 如果两个元素都是哈希图中的键:
    • 如果它们都指向同一个碰撞集,没关系
    • 如果它们指向不同的碰撞集
      • 创建新的碰撞集向量
      • 将两个碰撞集复制到新的碰撞集
      • 从碰撞列表中删除两个碰撞集
      • 将新的碰撞集添加到碰撞列表
      • 遍历新的冲突集并更新哈希图中每个元素的引用

在精细阶段,我现在可以简单地遍历碰撞列表中的所有碰撞集并进行精确的碰撞解决。

该解决方案相当快,但我有点担心内存占用。我将不得不做几个基准测试才能了解更多信息。

于 2012-09-01T21:54:42.430 回答