OBB有向包围盒,比AABB更贴身的碰撞检测盒子

2026-10-08 14:33:55 176阅读
OBB即有向包围盒,是一种常用于碰撞检测的包围体,与固定轴向的AABB不同,OBB可根据物体形状和朝向任意旋转,因此能更紧密地贴合物体,减少多余空隙,提高碰撞检测的准确性,它适合需要随物体旋转更新的场景,但构建和相交测试比AABB更复杂,计算成本也更高。

如果你做过游戏开发、机器人导航或三维点云处理,大概率遇到过这样一个问题:一个物体旋转之后,原本刚好包住它的盒子突然变得很大,比如一根斜放的木棍,如果只用一个与坐标轴对齐的盒子去包围,它的体积远大于木棍本身,这时就需要 OBB——有向包围盒。

OBB 是 Oriented Bounding Box 的缩写,中文常叫“有向包围盒”或“定向包围盒”,它和 AABB(轴对齐包围盒)最大的区别是:AABB 的边始终与世界坐标轴平行;OBB 的方向则可以任意旋转,尽量贴合物体本身的朝向,一个 OBB 通常由中心点、三个互相垂直的方向轴以及三个半长组成,二维中则可以理解为:中心点、两个正交方向、两个半宽。

OBB有向包围盒,比AABB更贴身的碰撞检测盒子

为什么需要 OBB?假设你在做赛车游戏,赛车在直道上行驶时,AABB 和 OBB 差别不大;但赛车一旦转弯或漂移,AABB 会随着车身旋转而重新计算,结果盒子明显变大,可能导致本不该发生的碰撞误报,OBB 会跟着车一起旋转,始终保持紧密,这个更贴身的特性,能减少“盒子明明碰到,车其实没碰到”的假阳性。

构建 OBB 的方法有很多,最简单的是把模型局部坐标系下的 AABB 随模型一起变换到世界空间,这样得到的其实就是一个 OBB:它保留了物体局部坐标轴的方向,但不一定是最紧凑的全局包围盒,更常用的方法是主成分分析(PCA),对模型的所有顶点计算协方差矩阵,求出特征向量,这些特征向量往往对应物体伸展最大的方向,把这三个特征向量作为 OBB 的三个轴,再把顶点投影到这些轴上,得到最小和最大值,就能构造出一个相对紧凑的 OBB,除此之外,还有寻找最小面积矩形、最小体积包围盒等优化方法,它们在工程中会根据精度和性能需求被选用。

OBB 的碰撞检测比 AABB 复杂不少,AABB 只需要比较几个区间;OBB 通常依赖分离轴定理(SAT,Separating Axis Theorem),SAT 的核心思想是:两个凸形状如果不相交,那么一定能在某个轴上把它们分开,对于三维中的两个 OBB,需要测试 15 条候选分离轴:第一个 OBB 的 3 条面法线,第二个 OBB 的 3 条面法线,以及它们的边方向两两叉乘得到的 9 条轴,把两个 OBB 分别投影到这些轴上,如果任意一条轴上的投影区间不重叠,就可以立即判定不相交;15 条轴都重叠,则它们相交,这也是为什么 OBB 检测比 AABB 慢,但仍然比直接对三角形网格做精确碰撞检测快得多。

在实际应用中,OBB 广泛存在于游戏开发、物理引擎、机器人、自动驾驶和计算机视觉等领域,游戏物理引擎常用 OBB 来做刚体之间的粗略碰撞检测,先快速排除不可能碰撞的物体,机器人抓取和自动驾驶中,车辆、行人等目标常常带有姿态信息,用 OBB 表示比 AABB 更符合真实轮廓,遥感图像和文字检测中的旋转目标框,本质上也是一种二维 OBB。

OBB 也不是万能的,它的优点是紧密、随物体旋转、减少误报;代价是存储更复杂、构建更耗时、碰撞检测计算量更大,工程上经常将 AABB、OBB、包围球和凸包等组合使用,形成层次化碰撞检测:先用便宜的 AABB 或球做粗略排除,再用 OBB 做中等精度检测,最后才用网格做精确检测。

OBB 是在“紧密性”和“计算效率”之间的一种折中,它比 AABB 更懂物体的姿态,又比凸包和三角网格更适合实时计算,理解 OBB 的表示、构建和 SAT 碰撞检测,是深入游戏物理和三维几何处理的必修课,下次当你看到一个旋转的物体被一个刚好贴身的盒子包住时,大概率就是 OBB 在背后起作用。

文章版权声明:除非注明,否则均为安好网原创文章,转载或复制请以超链接形式并注明出处。