Rob*_*son 42 structure dynamic collision-detection
我糊涂了.好吧不要混淆,不要想做6个测试程序,看看哪个算法最好.所以我想我会问我在这里的专家朋友给我带来他们经验的好处.
该场景是一个3d场景,与其内部对象的大小相比,可能面积相当大.场景中可能存在数千个对象.物体的大小从十分之一到大约10个单位不等,但不大(或更小).对象倾向于聚集在一起,但这些聚类可能会出现在场景中的任何位置.所有物体都是动态的,动人的.集群倾向于一起移动,但是当它们发生时,它们的速度可能不会一直相同.还需要考虑静态几何.虽然有大量的动态对象,但场景中也有一些静态对象(静态对象往往比动态对象大一到两个数量级).
现在,我想要的是一个空间数据结构,用于有效地对场景中的所有项目执行碰撞检测.如果算法也支持可见性查询,那么对于渲染管道来说会很棒.为简单起见,假设此处的碰撞检测是宽相的(即所有动态对象都是完美的球体).
所以,在我的研究中,我可以使用以下方法之一:
(1)八叉树(2)松散八叉树(3)线性八叉树(+松散)(4)KD树(5)BSP树(6)哈希
到目前为止(6)是我尝试过的唯一一个.它实际上是在速度方面完全高超(8192项碰撞下1ms的检查我的系统上),如果场景中的对象是平均均匀地分布.如果所有物体都被卷入一个较小的区域,这不是一个好的算法,我想这是可能的.
有没有人对使用哪一个有所了解,或者我可以用来加快速度的任何技巧?我想无论发生什么,我都可以使用单独的BSP树作为静态几何体.我想动态的"领域"是我最关心的问题.注意:没有CUDA,这只是CPU:p.
谢谢
编辑:好的,多亏了Floris,我发现了更多关于AABB Trees的信息.这里有关于GameDev的旧讨论:http://www.gamedev.net/topic/308665-aabb-tree---wheres-the-poly-o_o/ .看起来是一个很好的妥协.
最终编辑:决定不重新发明轮子.子弹物理库可能会为我做所有这些(它有AABB树,也可能非常优化).
mik*_*era 19
好问题.
你基本上有一个复杂的权衡:
坏消息是因为这个没有"完美"的答案 - 它将真正依赖于你的情况所特有的许多不同因素.例如,当BSP用大量静态平面几何体预先计算时,BSP的速度非常快,这就解释了为什么它们在早期FPS游戏中如此普遍.
我个人的猜测是,在你的情况下,每个底层边界框中具有合理数量的对象(5-10?)的松散AABB(轴对齐边界框)树可能效果最佳.原因:
对不起有点毛茸茸的答案,但我希望这给你一些有用的想法/事情要考虑!
小智 5
许多物理引擎使用AABBTree(轴对齐的边界框树),它将对象细分为越来越小的部分.使用此算法可以获得非常好的碰撞检测.这棵树看起来有点像八叉树.
OOBBTree(定向边界框)将是更好的对手部分.
| 归档时间: |
|
| 查看次数: |
22354 次 |
| 最近记录: |