你好。
我正在用 C++ 和 Raylib 开发一个项目,需要自己实现碰撞检测。如果有用的话,我为了简化问题,决定只让“引擎”中的可用碰撞器是旋转的矩形。
我在网上发现了一种优化碰撞检测的方法:使用四叉树(quadtree)划分空间,但是所有关于四叉树(以及其替代品,如松散四叉树和覆盖域)的解释似乎都假设了它们将用于的场景(例如,有些指南只谈论将点放入其中,而不是具有实际尺寸的多边形),或者不涵盖可能出现的情况。
例如,我一直困惑的一个问题是:假设我们试图将一个多边形放入四叉树中,而四叉树认为该多边形应该放入的空间分区已经满了,并且已经分区,空间分区太小无法容纳这个大多边形,而且上面的所有层也满了,移动多边形上去不可能。那么四叉树该怎么办?
在另一个帖子中,我提到了同样的疑问,收到了几条回复,尽管它们并没有完全解决我的疑问:
一位人士指出,四叉树是故障的空间划分系统,因为插入可能会失败,所以容量这个概念不应该存在(尽管所有关于四叉树的资源都提到容量,似乎是指在某个阈值后进行划分,但这可以在需要时超过),这位人士还提到,移动四叉树中的“粘性”多边形往往会导致四叉树失衡,顶层有很多多边形,并且为了这个原因,引擎有时会将同一个多边形存储在多个重叠的空间分区中,或者使用另一种数据结构,如松散四叉树(我也看了看,但没有找到解决我的问题的答案)
其他人也建议将同一个多边形存储在多个包含它的空间分区中可以有所帮助。
但是,容量这个问题仍然让人困惑,所有我遵循的指南(包括维基百科关于四叉树的文章)都将容量视为一个固定的界限:任何层次都不能超过 n 个碰撞器,不得超过,然而它们大多没有解决重叠问题(粘性多边形)因为它们假设你正在处理点,所以我很困惑,有点卡住了,可以帮我理解得更好吗?sorry for the dumb question
评论 (0)