5

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

我能想到的唯一方法是每帧清除整个树,然后将所有内容添加回那里,但这似乎会使 CPU 密集且效率不高。您是否每帧检查每个对象以查看它是否已移出当前四边形的边界,如果是,则将其删除并读取?这似乎又是非常低效的,因为您每帧都要对每个移动对象执行碰撞检查。

此外,关于四叉树,但与在其中移动的对象无关,您如何处理同一个四边形中的多个对象?我读过的大多数关于它们的网站都说你应该只在一个四边形中拥有一个,也许两个对象,如果你得到更多,然后将它们推到树中。如果你有这样的情况怎么办?你有三个圆圈,它们都在它们下一层的边缘,所以它们不能再往下走,但是有三个都在同一层,人们说你不应该有。

4

2 回答 2

1

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

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

于 2011-10-29T00:39:31.770 回答
0

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

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

于 2014-06-02T20:17:40.840 回答