AABB碰撞检查物理引擎的最佳数据结构是什么?

时间:2014-03-06 00:39:09

标签: algorithm data-structures language-agnostic

我需要一个引擎,它由一个装有轴对齐边界框(AABB)的世界组成。将执行连续循环,执行以下操作:

for box_a in world
    box_a = do_something(box_a)
    for box_b in world
        if (box_a!=box_b and collides(box_a, box_b))
            collide(box_a, box_b)
            collide(box_b, box_a)

显然,这个问题是O(n ^ 2)。我已经设法使这个循环更快地分区空间,所以这变成了:

for box_a in world
    box_a = do_something(box_a)
    for chunk in box_a.neighbor_chunks
        for box_b in chunk
            if (box_a!=box_b and collides(box_a, box_b))
                collide(box_a, box_b)
                collide(box_b, box_a)

这更快但有点粗糙。鉴于有这么快的算法并没有太多的努力,我敢打赌有一个我不知道的数据结构概括了我在这里所做的事情,为这个算法提供了更好的可扩展性。

所以,我的问题是:这个问题的名称是什么,实现它的最佳算法和数据结构是什么?

1 个答案:

答案 0 :(得分:1)

这确实是计算机科学的一般问题:空间划分。

它用于光线追踪,路径追踪,光栅渲染,物理,IA,游戏,并且非常确定HPC,数据库,矩阵数学,无论科学(分子,药房......),我打赌成千上万的其他东西

没有1 best结构,我有一个朋友在一个算法上做了他的主人来测试从激光扫描仪出来的云点(数十亿个数据),在他的情况下,最好的数据结构是将一系列制服3D网格与一些八叉树混合在一起。

对于其他人来说,kd-tree是最好的,对于其他人来说,BVH树是最好的。

我喜欢网格系统但如果空间太宽则无法工作,因为所有单元都必须存在。

有一天,我甚至使用哈希地图实现了一个稀疏的网格系统,它有效,我没有费心去分析或调查性能,所以我不知道它是否是一个很好的方式,我知道它的一种方式。

为此,您创建一个基本上是3D位置矢量哈希的KEY类,首先在坐标上应用整数除法来定义一个网格单元的大小。然后你愚蠢地将所有坐标哈希到一个哈希并提供hash_value方法或朋友方法。一个等于运算符,然后它可以在哈希映射中使用。

您可以在这些行中使用google::sparse_map或其他内容。我个人使用boost::unordered,这在我的情况下已经足够了。

然后要考虑的是AABB存在于多个细胞中。您可以在AABB覆盖的每个单元格中存储引用,这只是每个算法中需要注意的事项:“单元格引用和AABB之间没有1-1关系。”就是这样。

祝你好运