经纬志
首页 / three.js / 使用示例

定向包围盒

一栋 5 × 3 × 9 的长条建筑,转到 38 度后,轴对齐包围盒明显胖了一圈。 橙色是 AABB,蓝色是跟着建筑一起转的 OBB,左下角给出两者体积与多算的比例。

three.js 0.160.0 · 更新 2026-10-28
源码与运行效果
运行效果

两种盒子怎么算

AABB 用 new THREE.Box3().setFromObject(mesh), 它遍历几何体所有顶点,取世界坐标在各轴上的极值。盒子永远与坐标轴平行, 所以建筑一转,盒子的体积就跟着涨。

示例的 OBB 走的是简化路径:几何体本身就是轴对齐的盒子, 取它的本地包围盒八个角点乘上世界矩阵,得到的八面体跟着物体转。 任意网格的严格 OBB 需要求凸包与最小体积方向,通常借助 OBB.js 这类扩展实现。

项AABBOBB
计算量遍历全部顶点八个角点即可
随物体旋转不随随
体积固定 135转 38° 时约 135
典型用途粗筛、视锥剔除碰撞、标注避让

为什么在意体积差

包围盒常用于两件事:可见性判断与碰撞检测。用 AABB 做粗筛足够快, 但结果偏保守,长条形要素斜着摆时会误判为相交,导致大量无效的精细检测。 用 OBB 先过滤一遍,能显著减少后续三角形的求交次数。

标注避让也是同理。倾斜的楼用 AABB 去判断标牌有没有压到, 会把本来空着的位置判成冲突,标牌被迫挪到更远的地方。

更新矩阵再取盒子。setFromObject 依赖世界矩阵, 改过 rotation 或 position 之后必须先 updateMatrixWorld(true),否则拿到的是上一帧的位置,盒子会跟不上。