我有些困惑,不是真正的困惑,只是不想做6个测试程序来看哪个算法最好。因此,我想向SO上的专家朋友们请教一下他们的经验。
场景是一个三维场景,与其中的对象相比可能有相当大的面积。场景中可能有成千上万个对象。对象的大小从十分之一单位到大约10个单位不等,但没有更大(或更小)的对象。对象往往会聚集在一起,但这些集群可能出现在场景的任何地方。所有对象都是动态的并且在移动。集群往往会一起移动,但当它们移动时,它们的速度可能并不总是相同的。还需要考虑静态几何。虽然场景中有大量的动态对象,但也有一些静态对象(静态对象往往比动态对象大一到两个数量级)。
现在,我想要一个空间数据结构,以便有效地执行场景中所有项目的碰撞检测。如果该算法还支持可视性查询,则效果将非常好,用于渲染管道。为简单起见,假设这里的碰撞检测是广义的(即所有动态对象都是完美的球体)。
因此,在我的研究中,我可以使用以下之一:
(1) 八叉树 (2) 宽松八叉树 (3) 线性八叉树+宽松八叉树 (4) KD树 (5) BSP树 (6) 哈希
到目前为止,我只尝试过(6)。如果场景中的对象平均分布,则速度非常快(在我的系统上检查8192个项目的碰撞时间不到1毫秒)。如果所有对象被限制在一个较小的区域内,那么它并不是一个好算法,这可能是可能的。
有没有人对使用哪个技术有什么见解,或者有哪些技巧可以加快速度?我想无论发生什么情况,我都可以为静态几何体使用单独的BSP树。我想最让我担心的是动态“球体”。请注意:没有CUDA,这只是CPU :p.
谢谢
编辑:好的,感谢Floris,我找到了更多关于AABB树的信息。 在GameDev上有一个旧的讨论:http://www.gamedev.net/topic/308665-aabb-tree---wheres-the-poly-o_o/。 看起来是个不错的折衷方案。
最终编辑:决定不重复造轮子了。可能Bullet物理库会为我完成所有这些工作(它在其中有AABB树,可能也被很好地优化了)。