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



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

我能想到的唯一方法是每帧清除整个树,然后把所有东西都加回去,但这似乎会占用cpu资源,而且效率不高。你是否每帧检查每个对象,看看它是否已经移动到它当前四边形的边界之外,如果是,然后删除它并读取它?这看起来效率很低,因为你需要在每一帧中对每一个移动的物体执行碰撞检查。

另外,关于四叉树,但与在其中移动的对象无关,您如何处理同一四叉树中的多个对象?我读过的大多数网站都说,你应该在一个四边形中只有一个,或者两个对象,如果你有更多的对象,那么就把它们推到树下。如果你遇到这样的情况呢?你有三个圆,它们都在下一层的边缘上,所以它们不能再往下走了,但是有三个圆都在同一层,人们说你不应该这样做。

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

关于你的第二个问题:我不知道其他人是如何实现四叉树的,但我允许对象占用多个四叉树,正是因为你在图表中给出的原因(当对象跨越边界时)。所以一个对象有一个"current list of quads"而不是"current quad"

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

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

相关内容

  • 没有找到相关文章

最新更新