我正在创建我的第一个 3D 游戏,但遇到了一些问题。
我读到了AABB相交以及从中构建树的想法,但我无法理解的一件事是,如果我的“角色”在游戏中旋转,轴对齐的概念就不会被保留!
我检查了几个库(如 oz-collide、OPCODE 等),并且我看到这些实现是为静态对象制作的,因为它使用没有来源的盒子(对于非静态,所有节点每次移动后都应更新树中的内容)。
那些库应该是超快的,我可能在某个地方弄错了。
解释是什么?
我正在创建我的第一个 3D 游戏,但遇到了一些问题。
我读到了AABB相交以及从中构建树的想法,但我无法理解的一件事是,如果我的“角色”在游戏中旋转,轴对齐的概念就不会被保留!
我检查了几个库(如 oz-collide、OPCODE 等),并且我看到这些实现是为静态对象制作的,因为它使用没有来源的盒子(对于非静态,所有节点每次移动后都应更新树中的内容)。
那些库应该是超快的,我可能在某个地方弄错了。
解释是什么?
可悲的是,如果你的角色旋转,你需要重新计算你的 AABB,它也不一定是合适的。如果您有一个矩形并将其旋转以使其不再是直线,则 AABB 将大于对象。
AABB 速度很快,因为相交测试非常简单,但正如您已经发现的那样,当需要在未与 AABB 轴对齐的对象上进行精确相交时,就会出现问题。
AABB 对于快速测试仍然很有用,我怀疑这些树是为此而生的。使用 AABB 树,您可以从更准确的测试阶段快速消除大量对象。如果查询返回几个额外的对象,则无关紧要。在您的角色旋转案例中,这可能意味着您的角色被视为在一个区域中,而他/她实际上并非如此。
AABB 树很容易做到这一点,因为每次您通过测试时,您都会更深入地了解树并了解更多细节。
当您需要真正准确的交叉点时,您可以使用定向边界框 (OBB)。它可以用分离轴定理来实现。我看到 oz-collide 已经支持 OBB。
有很多关于 OBB 的资源,这个对我有帮助: GPWiki 上的分离轴定理
这是一个实现。
如果需要,您可以从 OBB 计算 AABB。
OZCollide 适用于可移动实体并且与时间无关(您只需提供速度向量)。它也适用于 OBB(不仅是 AABB)。
检查在线文档:
http ://www.tsarevitch.org/ozcollide/docs/链接已损坏