使用四叉树时,如何处理在四边形之间移动的对象?

时间:2011-10-18 02:36:23

标签: algorithm tree quadtree

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

我能想到的唯一方法是每帧清除整个树,然后在那里添加所有内容,但这似乎可以获得cpu密集而且效率不高。你是否检查每一帧的每一个物体,看它是否已移出它当前四边形的边界,如果是,那么将它移除并读取它?这看起来似乎效率非常低,因为你每帧都会对每个移动物体进行碰撞检查。

此外,关于四边形但与在其中移动的对象无关,如何处理同一个四边形中的多个对象?我读过的关于它们的大多数网站都说你应该在一个四边形中只有一个,也许两个,如果你得到的更多,那么就把它们推到树上。如果您遇到类似this的情况怎么办?你有三个圆圈,它们都在它们下面的水平边缘,所以它们不能再往下走了,但是有三个都在同一级别,人们说你应该没有。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

关于你的第二个问题,你需要一些灵活性 - 如果所有3个都处于边缘,那么你就不能降低它们 - 但这应该是(原谅双关语)边缘情况。