如何混合普通和基于四叉树的碰撞检测?

时间:2016-12-11 21:54:56

标签: java collision-detection quadtree

我为所有静态碰撞对象设置了四叉树,这对于碰撞检测和光线投射都非常有用

然而,由于我还有非静态碰撞对象,当我进行光线投射时,我想将它们包括为可能的光线可碰撞对象

实现这一目标的最佳方式(在性能方面)是什么?我目前的想法是:

1)克隆四叉树,添加非静态对象,然后将其用于光线投射

2)将非静态对象添加到当前四叉树,其中一些标志基本上阻止四叉树分裂其四边形,即使子节点中允许的子节点数多于子节点数。然后四叉树必须清理"一旦光线投射完成后自己

3)确定最近的静态物体碰撞(使用四叉树)后,只需遍历所有非静态物体并查看光线是否与它们发生碰撞,然后检查碰撞点是否接近最近的静态物体物体碰撞点

所有这些想法看起来都有点麻烦,所以我正在寻找可能更高效的其他想法

如果重要,我使用Java

1 个答案:

答案 0 :(得分:0)

在1)如果你有超过10个对象,克隆四叉树可能非常昂贵,所以我不会这样做。

在2)为什么不保留非静态对象列表?只需将所有对象添加到树中(我不知道为什么拆分是一个问题)并在计算后从树中重新加入它们。

在3)如果您有许多非静态对象,这是非常昂贵的,但如果你的很少,可能是最便宜的解决方案。

更多想法:

4)为非静态对象构建第二个四叉树并进行碰撞检测(类似于5))。碰撞后,只需丢弃第二棵树。

5)如果拆分节点确实存在问题,那么使用PH-Tree怎么样?它就像一个四叉树,但它的行为比四叉树更静态(没有插入/删除会修改多个节点(除了另外创建删除一个空节点)。

6)根据您的非静态对象的速度,您可以使用“移动对象树”(只需谷歌,有一些专用结构)。 如果对象不是太快,PH-Tree可能再次成为一个不错的选择,它有一个专门的移动/更新方法。