collision-detection - 具有可移动和可旋转角色/对象/等的游戏中的 AABB

标签 collision-detection aabb

我正在创建我的第一款 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/

相关文章:

2d - 边界框碰撞处理 - 不是检测

javascript - 当一个元素被javascript中的另一个元素触摸时,如何更改该元素的位置?

algorithm - 为什么我应该使用 AABB 进行 Circle-Circle 碰撞

c# - 否定导致 5 倍减速的 bool 值评估的真实性?

python - Pygame-子弹和敌人的碰撞,没有 Sprite 或类

java - 动圈弹性碰撞

javascript - CannonJS 锁定特定轴上的旋转

c++ - 最小元素错误

c++ - 使用扫掠 AABB 交叉算法解决碰撞法线