我正在尝试使用四叉树进行二维碰撞检测,但我对如何实现它感到有点困惑。首先,我有一个四叉树,其中包含四个子树(一个代表每个象限),以及一组不适合单个子树的对象。
当检查对象中树中的碰撞时,我会做这样的事情(感谢QuadTree for 2D collision detection):
要查找四叉树中的所有碰撞:
要插入四叉树:
更新四叉树:
这样好吗?可以改进吗?
答案 0 :(得分:35)
您的四叉树结构不是最佳的。您每个节点存储4个子树是正确的,但实际对象应该只存储在叶子内部,而不是内部节点。因此,需要将保存实际对象的集合移动到叶子上。
让我们看一下操作的实现:
这有几个优点:
仅 disatvantage :
答案 1 :(得分:6)
四叉树并不总是碰撞检测的最佳数据结构。四叉树的开销可能是无限的(如果你不限制树的深度),并且在最坏的情况下根本不提供任何加速。相反,您可能需要考虑使用稀疏网格,这样可以提供比四叉树更好的性能,而不会产生遍历多个树级别的额外开销。
还有其他完全不同的方法甚至可能更好。例如,您可以尝试实现Zomorodian和Edelsbrunner的算法,就像我在以下模块中所做的那样:
以下是我撰写的一些文章,更详细地讨论了这些问题:
特别是,如果你看一下上一节中的基准测试,你会看到所有被调查的图书馆,与其他碰撞检测方法(如R树,网格或细分树)相比,四叉树的表现往往很差。
答案 2 :(得分:0)
我不确定cpu的效果如何,但它似乎在eclipse中我的核心二人组正常工作,仍然以超过2400 fps的速度运行lol ..
基本上,我向可碰撞对象添加了一个列表,用于存储对与对象关联的四叉树节点对象的引用(通过插入到四叉树中)。我还为每个四叉树节点添加了一个列表,该列表存储对该节点范围内的任何对象的引用。因此每个节点只有一个对象出现。每个节点还存储对其父节点的引用,用于导航到附近节点,如果我想在初始节点之后检查它们中的任何节点以进一步确保碰撞准确性。
很容易获得对一个单元格中所有其他对象的引用:
list temp_checklist = object.cells[cell_index].objects
//('objects' being some sort of array or list of object references as described above)
希望能帮到某人;)