首页 / three.js / 使用示例
定向包围盒
一栋 5 × 3 × 9 的长条建筑,转到 38 度后,轴对齐包围盒明显胖了一圈。 橙色是 AABB,蓝色是跟着建筑一起转的 OBB,左下角给出两者体积与多算的比例。
源码与运行效果
两种盒子怎么算
AABB 用 new THREE.Box3().setFromObject(mesh),
它遍历几何体所有顶点,取世界坐标在各轴上的极值。盒子永远与坐标轴平行,
所以建筑一转,盒子的体积就跟着涨。
示例的 OBB 走的是简化路径:几何体本身就是轴对齐的盒子,
取它的本地包围盒八个角点乘上世界矩阵,得到的八面体跟着物体转。
任意网格的严格 OBB 需要求凸包与最小体积方向,通常借助
OBB.js 这类扩展实现。
| 项 | AABB | OBB |
|---|---|---|
| 计算量 | 遍历全部顶点 | 八个角点即可 |
| 随物体旋转 | 不随 | 随 |
| 体积 | 固定 135 | 转 38° 时约 135 |
| 典型用途 | 粗筛、视锥剔除 | 碰撞、标注避让 |
为什么在意体积差
包围盒常用于两件事:可见性判断与碰撞检测。用 AABB 做粗筛足够快, 但结果偏保守,长条形要素斜着摆时会误判为相交,导致大量无效的精细检测。 用 OBB 先过滤一遍,能显著减少后续三角形的求交次数。
标注避让也是同理。倾斜的楼用 AABB 去判断标牌有没有压到, 会把本来空着的位置判成冲突,标牌被迫挪到更远的地方。
更新矩阵再取盒子。setFromObject 依赖世界矩阵,
改过 rotation 或 position 之后必须先
updateMatrixWorld(true),否则拿到的是上一帧的位置,盒子会跟不上。