bfo*_*ops 32 quadtree collision game-physics data-structures
我正在尝试使用四叉树进行二维碰撞检测,但我对如何实现它感到有点困惑.首先,我有一个四叉树,其中包含四个子树(一个代表每个象限),以及一个不适合单个子树的对象集合.
当检查对象在树中的碰撞时,我会做这样的事情(感谢QuadTree用于2D碰撞检测):
要查找四叉树中的所有碰撞:
要插入四叉树:
要更新四叉树:
这好吗?可以改进吗?
Dav*_* O. 37
您的四叉树结构不是最佳的.您每个节点存储4个子树是正确的,但实际对象应该只存储在叶子内部,而不是内部节点.因此,需要将保存实际对象的集合移动到叶子上.
我们来看看操作的实现:
这有几个好处:
只有不利条件:
四叉树并不总是用于碰撞检测的最佳数据结构.四叉树的开销可能是无限的(如果你不限制树的深度),并且在最坏的情况下根本不提供任何加速.相反,您可能需要考虑使用稀疏网格,这样可以提供比四叉树更好的性能,而无需遍历多个树级别的额外开销.
还有其他完全不同的方法甚至可能更好.例如,您可以尝试实现Zomorodian和Edelsbrunner的算法,就像我在以下模块中所做的那样:
以下是我写的一些文章,更详细地讨论了这些问题:
特别是,如果你看一下上一节中的基准测试,你将会看到所有被调查的图书馆,与其他碰撞检测方法(如R-Trees,网格或细分树)相比,四叉树往往表现不佳.