从粗略到精细的碰撞检测-同一物体上的多次碰撞
From Coarse to Fine Collision Detection - Multiple Collisions on Same Object
我目前正在研究一种碰撞检测算法,该算法具有检测可能碰撞的宽阶段和对碰撞进行确定性解决的精细阶段。宽阶段基于分层哈希网格,并且运行良好。
精细阶段基于自定义算法,适用于n体碰撞。然而,为了准确地解决多于两体的碰撞,我需要以某种方式注册所有碰撞和碰撞集中的相应元素。
在宽阶段以某种方式保存碰撞,以便在精细阶段迭代碰撞集的最佳方法是什么?我一直在思考某些数据结构,但我还没有想出一个理想的解决方案。
这篇论文的技术似乎不适用于性能关键的情况。
这项技术似乎试图解决这样一种情况,即一个物体可以"传送"到另一个物体的另一边而不会发生碰撞,因为模拟中的移动物体通常只在每次迭代中重新定位。
我建议将每个对象挤出自上次更新以来经过的任何空间。例如,一个向上移动的盒子会变成一个更高的盒子。
然后,您可以快速检测潜在的碰撞,甚至不必考虑运动或更新速率。然后可以随心所欲地仔细检查潜在的碰撞。
我当前的方法
在思考了这个问题一段时间后,我决定尝试以下方法。
- 碰撞集是元素的向量
- 冲突集本身存储在列表中
- 每个元素都指向哈希映射中的冲突集
如果现在在宽阶段检测到碰撞:
- 如果两个元素都不是hashmap中的键:
- 将为碰撞集创建一个新向量
- 两个元素都添加到冲突集中
- 冲突集将添加到冲突列表中
- 这两个元素都作为冲突集的关键字插入到hashmap中
- 如果一个元素是hashmap中的键:
- 通过该元素检索冲突集
- 另一个元素被添加到冲突集中
- 另一个元素作为冲突集的关键字插入到hashmap中
- 如果这两个元素都是hashmap中的一个键:
- 如果它们都指向同一个碰撞集,也没关系
- 如果它们指向不同的碰撞集
- 创建新的碰撞集向量
- 将两个碰撞集复制到新的碰撞集中
- 从冲突列表中删除两个冲突集
- 将新的冲突集添加到冲突列表
- 遍历新的冲突集并更新每个元素的hashmap中的引用
在精细阶段,我现在可以简单地迭代冲突列表中的所有冲突集,并进行精确的冲突解决。
解决方案相当快,但我有点担心内存不足。我必须做几个基准测试才能了解更多信息。
相关文章:
- 落砂模拟碰撞检测C++和SFML
- SFML 中的重力和碰撞检测
- 我的碰撞检测中的奇怪行为
- 如何为球形物体和三角形地形提供高效的碰撞检测和响应
- 圆形与方形碰撞检测以及需要响应C++ |OpenGL。我的问题就是这个"I need to keep the circle outside the square"
- 在Qt3D中进行碰撞检测的预期方法(或好方法)是什么?
- 在碰撞检测方面苦苦挣扎.如何正确检测碰撞?
- 三角形-三角形碰撞检测问题
- 不同类别之间的C SFML碰撞检测
- 使用D3DXVECTOR C 的碰撞检测,发生碰撞后该怎么办
- 当我发生碰撞检测时,矢量迭代器不兼容
- 如何使用灵活的碰撞库在两个点云或点云与机器人末端执行器模型之间进行碰撞检测
- Box2D ContactListener未检测到碰撞
- 优化碰撞检测C
- 使用碰撞检测来增加SFML 2.4中的游戏分数的问题
- 使用OnComponentHit UE4 C++进行碰撞检测
- 体素世界中的碰撞检测
- 如何在 2D 碰撞检测中正确解析碰撞的位置?
- (中广)获取AABB树生成的边界立方体进行碰撞检测
- 使用C 中的单元格 /图块 /网格进行碰撞检测的最佳数据结构