首页 / three.js / API 文档
Box3
先看结论
轴对齐包围盒。用两个对角点描述一块立方体空间, 用于快速排除、求整体范围、判断物体是否在视锥内。
new THREE.Box3(min, max)
构造参数
| 参数 | 默认 | 说明 |
|---|---|---|
min | (+Infinity, +Infinity, +Infinity) | 最小角点 |
max | (-Infinity, -Infinity, -Infinity) | 最大角点 |
默认值构成一个空盒:min 大于 max。
直接往空盒里 expandByPoint 会得到正确结果,
而手工赋值容易留下错误范围。
属性
| 属性 | 说明 |
|---|---|
min | 最小角点,Vector3 |
max | 最大角点,Vector3 |
isBox3 | 恒为 true |
方法
| 方法 | 说明 |
|---|---|
set(min, max) | 直接设置两个角点 |
makeEmpty() | 重置为空盒 |
isEmpty() | 是否为空盒 |
setFromArray(array) | 由顶点数组求范围 |
setFromBufferAttribute(attr) | 由位置属性求范围 |
setFromPoints(points) | 由点数组求范围 |
setFromObject(object, precise) | 按对象的几何与变换计算世界包围盒 |
setFromCenterAndSize(center, size) | 由中心与尺寸构造 |
expandByPoint(point) | 扩张到包含该点 |
expandByObject(object) | 扩张到包含该对象 |
expandByScalar(delta) | 各方向同时外扩 |
containsPoint(point) | 点是否在盒内 |
containsBox(box) | 是否完全包含另一个盒 |
intersectsBox(box) | 与另一个盒是否相交 |
intersectsSphere(sphere) | 与球是否相交 |
intersectsPlane(plane) | 与平面是否相交 |
clampPoint(point, target) | 把点夹到盒内最近的合法位置 |
distanceToPoint(point) | 到点的最短距离,点在内部时为 0 |
getBoundingSphere(target) | 转成包围球 |
getCenter(target) | 盒中心 |
getSize(target) | 盒尺寸 |
union(box) | 合并另一个盒 |
intersect(box) | 求交集,不相交时变为空盒 |
applyMatrix4(matrix) | 用变换矩阵改写盒,结果会重新轴对齐 |
translate(offset) | 整体平移 |
clone() / copy(box) | 复制 |
示例:求整个场景的范围
const box = new THREE.Box3();
box.setFromObject(scene);
const size = box.getSize(new THREE.Vector3());
const center = box.getCenter(new THREE.Vector3());
console.log('范围', size, '中心', center);
// 相机取景:按包围球自动定位
const sphere = box.getBoundingSphere(new THREE.Sphere());
const distance = sphere.radius / Math.tan(Math.PI * camera.fov / 360);
camera.position.copy(sphere.center).add(new THREE.Vector3(0, distance * 0.6, distance));
camera.lookAt(sphere.center);
setFromObject 的精确度
默认只累加对象与子对象的几何包围盒,几何本身是粗包围盒,
旋转后的模型范围会偏大。传 precise: true
改为遍历顶点,结果更准,但大模型上非常耗时。
只在导出、适配相机这类一次性计算里使用。
与视锥剔除的关系
Frustum.intersectsObject 内部取的是对象的包围球,
不是包围盒。包围球由几何体的 computeBoundingSphere 生成,
动态修改顶点后必须重新计算,否则剔除判断仍按旧范围,
物体会在屏幕边缘提前消失。
空盒参与运算会污染结果。union 与空盒合并后仍是原盒,
这通常没问题;但 intersect 遇到空盒立即变成空盒。
循环里求交前先用 isEmpty() 判断,能省掉大量无效计算。
经纬志(2026)。《Box3》。https://www.jingweizhi.com/three/api/box3.html(访问日期 2026-11-03)。