我正在创建我的第一款 3D 游戏,但遇到了一些问题。
我读到了 AABB交集和从中构建树的想法,但我无法理解的一件事是,如果我的“角色”在游戏过程中旋转,则不会保留轴对齐的概念!
我已经检查了几个库(如 oz-collide、OPCODE 等),并且我看到这些实现是针对静态对象的,因为它使用没有原点的框(对于非静态,树中的所有节点都应在每次移动后更新)。
那些库应该 super 快,但我可能在某处弄错了。
这是什么解释?
最佳答案
遗憾的是,如果你的角色旋转,你需要重新计算你的 AABB,而且它也不一定是紧密贴合的。如果您有一个矩形并旋转它使其不再直线,则 AABB 将比对象大。
AABB 速度很快,因为相交测试非常简单,但正如您已经发现的那样,当对象未与 AABB 轴对齐时需要精确相交时,它就会出现问题。
AABB 对于快速测试仍然很有用,我怀疑这些树就是为此而生的。使用 AABB 树,您可以从更准确的测试阶段快速消除大量对象。如果查询返回几个额外的对象,那也没什么大不了的。在您旋转的角色案例中,这可能意味着您的角色被视为在他/她实际上不在的区域中。
AABB 树很容易做到这一点,因为每次通过测试时,您都会深入到树中并了解更多细节。
当您需要非常准确的交叉点时,您可以使用定向边界框 (OBB)。它可以用 separating axis theorem 来实现.我看到 oz-collide 已经支持 OBB。
有很多关于 OBB 的资源,这个对我有帮助: GPWiki on separating axis theorem
这是一个 implementation .
如果需要,您可以从 OBB 计算 AABB。
关于collision-detection - 具有可移动和可旋转角色/对象/等的游戏中的 AABB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102602/