什么是AABB - 碰撞检测?

60

嗨,我正在使用Java制作一个体素游戏,在研究需要学习的不同内容时,我注意到很多游戏都使用AABB进行碰撞检测。然后我想起在Minecraft中也看到了AABB。但是当我搜索AABB是什么时,只会出现其他人的代码或一些历史书籍上的组织。Stackoverflow,AABB是什么?

2个回答

72

AABB代表 "轴对齐包围盒"。

它是一种相当计算和内存效率高的表示体积的方式,通常用于检查两个物体是否可能接触。

由于它是轴对齐的,因此它不一定很好地“适合”您的真实3D物体。 AABB检查通常用作粗略的第一近似,以查看对象是否可能发生碰撞。然后,如果AABB检查通过,则进行更详细的检查。

例子:

想象一下您的世界是2D的,并将其绘制在一张图纸上。 你有一些物体(球、树等)。 为了为一个物体创建AABB,您在物体周围画一个矩形,使您的线与纸上的网格线平行。

如果您拥有两个物体的AABB,则可以做一些非常简单的数学运算来确定这些AABB是否重叠。 如果它们不重叠,则这两个物体不可能接触,因此这是您的碰撞算法的易于处理的提前退出。

这个概念也很容易推广到3D(和更多的D)中。

您可能还想查看gamedev.stackexchange.com


由于体素游戏主要是由方块构成,所以我认为它的轴对齐并不是一个问题。然而,如果我正在制作一款角色扮演游戏,并且希望我的角色在远处避免撞到墙壁时看起来更加逼真,那就是一个合理的要求。 - SemperAmbroscus
@FeatheredOrcian:是的,如果您的体素已经轴对齐,那么AABB就非常适合。您甚至可能不需要将它们单独存储,而是可以从您的体素数据中推导出它们的数据。 - jwd

10

轴对齐边界框

基本上是可以完全包含形状的最小轴对齐长方体。通常由一对3D坐标定义。

检查两个AABB之间的碰撞非常快速,只需要检查角落的X、Y和Z值的范围,因此它被用作快速的第一步来削减可能的碰撞数量,此后可以使用更复杂但计算密集的方式。


5
这正确吗?“面向边界框”不应该是能够包含形状的最小长方体吗?轴对齐边界框是与全局坐标轴对齐且完全包含形状的最小长方体。 - user0221441
面向对象的盒子较小,但测试速度较慢。如果发生AABB碰撞,您可以继续使用一些更精细的碰撞方法进行测试,例如模板缓冲区测试。 - Radim Kolář
是的,我应该说的是-最小的轴对齐立方体,我已经添加了。 - Tim B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接