使用四叉树时,如何处理物体在四叉之间移动的情况?

5

我正在尝试在我制作的游戏中使用四叉树进行碰撞检测,但我不确定如何处理可能在不同象限之间移动的对象?

我能想到的唯一方法是每帧清除整个树,然后将所有内容重新添加进去,但这似乎会变得非常耗费cpu并且效率不高。您是否每帧检查每个对象是否移动到其当前象限的边界之外,如果是,则将其删除并重新添加?那似乎也会非常低效,因为您将在每个移动对象上执行碰撞检查。

此外,关于四叉树,但与其中移动的对象无关,如何处理相同象限中的多个对象?我阅读的大多数网站都说您应该在一个象限中只有一个或两个对象,如果超过这个数量,则将它们推入树中。如果您遇到像这样的情况怎么办?您有三个圆,它们都在下面一级的边缘,因此无法进一步向下移动,但是在同一级别中有三个圆形,人们说您不应该这样做。


你使用四叉树是为了什么?如果你想在碰撞检测中使用它们,那么扫描和修剪算法会更好。 - Dmitry Sapelnikov
2个回答

1

我不认为实现你的建议特别低效:检查对象是否移动到其四叉树之外,如果是,则将其删除并重新添加。任何从一帧到下一帧移动的对象都需要执行一些碰撞检测,对吧?而且仅当它移动四叉树时才执行四叉树操作,并且在那里花费的 CPU 时间可能被进行更精确的“A 对象是否接触 B 对象?”计算的 CPU 时间所掩盖。因此我不知道你能做得更好。

关于你的第二个问题:我不知道其他人如何实现四叉树,但是我允许对象占用多个四叉树,正是出于你在图中给出的原因(当一个对象跨越边界时)。因此,一个对象具有“当前四叉树列表”而不是“当前四叉树”。


0

通过向上移动四叉树而不是完全从树中删除项目然后重新添加,可以优化删除/重新添加的过程,即移动到“父”四叉树,然后由“父”添加它 - 如果它不适合“父”,则转到“祖父母”等。

至于您的第二个问题,您需要一些灵活性 - 如果所有3个都在边缘上,则无法将它们降低 - 但那应该是(请原谅双关语)一个特殊情况。


对于问题2,你可以创建更小的四边形,即添加更多的维度。 - Micromega
较小的四边形将与大四边形共享相同的边缘 - 因此,即使您要添加更多,因为圆已经在边缘上,它们仍将保持在边缘上。 - user2813274

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接