从粗略到精细的碰撞检测-同一物体上的多次碰撞

From Coarse to Fine Collision Detection - Multiple Collisions on Same Object

本文关键字:碰撞 碰撞检测      更新时间:2023-10-16

我目前正在研究一种碰撞检测算法,该算法具有检测可能碰撞的宽阶段和对碰撞进行确定性解决的精细阶段。宽阶段基于分层哈希网格,并且运行良好。

精细阶段基于自定义算法,适用于n体碰撞。然而,为了准确地解决多于两体的碰撞,我需要以某种方式注册所有碰撞和碰撞集中的相应元素。

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

这篇论文的技术似乎不适用于性能关键的情况。

这项技术似乎试图解决这样一种情况,即一个物体可以"传送"到另一个物体的另一边而不会发生碰撞,因为模拟中的移动物体通常只在每次迭代中重新定位。

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

然后,您可以快速检测潜在的碰撞,甚至不必考虑运动或更新速率。然后可以随心所欲地仔细检查潜在的碰撞。

我当前的方法

在思考了这个问题一段时间后,我决定尝试以下方法。

  • 碰撞集是元素的向量
  • 冲突集本身存储在列表中
  • 每个元素都指向哈希映射中的冲突集

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

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

在精细阶段,我现在可以简单地迭代冲突列表中的所有冲突集,并进行精确的冲突解决。

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