THREE.Box2 是 Three.js 中用来表示二维轴对齐边界框(AABB)的类。它通常用于碰撞检测或定义一个平面上的包围区域。
需要注意的是所有的方法都是根据 min 与 max 的点来确定的,这两个是基础 例如 new THREE.Box2(min,max) 才会有下列的属性与方法
getParameter 使用这个时要注意计算参数的方式
Box2 有两个属性,二十二个方法
属性
- min 获取平面盒子的下边界点(x, y)。 默认值为( + Infinity, + Infinity )。
- max 表示该盒子的上边界(x, y)。 默认值为( - Infinity, - Infinity )。 方法
- clampPoint ( point : Vector2, target : Vector2 ) : Vector2 THREE.Box2.clampPoint(point, target) 和 THREE.Box3.clampPoint(point, target) 类似,它用于将二维点限制在 Box2 的范围内。假如该点位于 Box2 外部,clampPoint 会返回包围盒边界上距离该点最近的点。如果该点已经在 Box2 内,则保持原点不变。
// 创建一个 Box2,定义它的最小点和最大点
const minVector = new THREE.Vector2(-1, -1);
const maxVector = new THREE.Vector2(1, 1);
const box = new THREE.Box2(minVector, maxVector);
// 定义一个点,该点位于 Box2 外部
const point = new THREE.Vector2(2, 0.5);
// 使用 clampPoint 将点限制在 Box2 内部
const clampedPoint = new THREE.Vector2();
box.clampPoint(point, clampedPoint);
console.log("Original Point:", point); // Vector2(2, 0.5)
console.log("Clamped Point:", clampedPoint); // Vector2(1, 0.5)
- clone () : Box2 返回一个新的Box2,其min和max与此盒子相同。
- containsBox ( box : Box2 ) : Boolean box - 要检查是否被包含的盒子。如果盒子包含整个被检查盒子,则返回true。如果两者重叠,也会返回true。
// 创建第一个 Box2,表示较大的包围盒
const minVector1 = new THREE.Vector2(-2, -2);
const maxVector1 = new THREE.Vector2(2, 2);
const box1 = new THREE.Box2(minVector1, maxVector1);
// 创建第二个 Box2,表示较小的包围盒
const minVector2 = new THREE.Vector2(-1, -1);
const maxVector2 = new THREE.Vector2(1, 1);
const box2 = new THREE.Box2(minVector2, maxVector2);
// 使用 containsBox 检查 box1 是否包含 box2
const isContained = box1.containsBox(box2);
console.log("Box1 contains Box2:", isContained); // true
// 创建另一个 Box2,它超出了 box1 的范围
const minVector3 = new THREE.Vector2(-3, -3);
const maxVector3 = new THREE.Vector2(1, 1);
const box3 = new THREE.Box2(minVector3, maxVector3);
// 检查 box1 是否包含 box3
const isContained2 = box1.containsBox(box3);
console.log("Box1 contains Box3:", isContained2); // false
- containsPoint ( point : Vector2 ) : Boolean point - 要检查是否被包含的点Vector2。如果指定的点(point)位于盒子的边界内或边界上,则返回true。
- copy ( box : Box2 ) : this 将box的min 和 max复制到此盒子中。
- distanceToPoint ( point : Vector2 ) : Float THREE.Box2.distanceToPoint(point) 是 Three.js 中的一个方法,用于计算 Box2 边界到某个点的最短距离。如果点在 Box2 内部,距离为 0;如果点在 Box2 外部,则返回点到最近边界的距离。
// 创建一个 Box2,定义最小点和最大点
const minVector = new THREE.Vector2(-1, -1);
const maxVector = new THREE.Vector2(1, 1);
const box = new THREE.Box2(minVector, maxVector);
// 定义一个位于 Box2 内部的点
const pointInside = new THREE.Vector2(0.5, 0.5);
const distanceInside = box.distanceToPoint(pointInside);
console.log("Distance to point inside box:", distanceInside); // 0
// 定义一个位于 Box2 外部的点
const pointOutside = new THREE.Vector2(2, 2);
const distanceOutside = box.distanceToPoint(pointOutside);
console.log("Distance to point outside box:", distanceOutside); // 1.4142135623730951
// 定义一个位于 Box2 边界上的点
const pointOnEdge = new THREE.Vector2(1, 1);
const distanceOnEdge = box.distanceToPoint(pointOnEdge);
console.log("Distance to point on edge of box:", distanceOnEdge); // 0
- equals ( box : Box2 ) : Boolean box - 要对比的盒子 如果这个盒子和被对比盒子具有相同的上下边界,则返回true。
THREE.Box2.equals(box)方法用于比较两个Box2对象是否相等。判断的依据是两个Box2的最小点和最大点是否都相等。如果两个Box2的最小点和最大点相同,则返回true,否则返回false。
// 创建两个相等的 Box2
const minVector1 = new THREE.Vector2(-1, -1);
const maxVector1 = new THREE.Vector2(1, 1);
const box1 = new THREE.Box2(minVector1, maxVector1);
const minVector2 = new THREE.Vector2(-1, -1);
const maxVector2 = new THREE.Vector2(1, 1);
const box2 = new THREE.Box2(minVector2, maxVector2);
// 比较两个相等的 Box2
console.log("Box1 equals Box2:", box1.equals(box2)); // true
// 创建一个不同的 Box2
const minVector3 = new THREE.Vector2(0, 0);
const maxVector3 = new THREE.Vector2(2, 2);
const box3 = new THREE.Box2(minVector3, maxVector3);
// 比较 box1 和 box3
console.log("Box1 equals Box3:", box1.equals(box3)); // false
- expandByPoint ( point : Vector2 ) : this
THREE.Box2.expandByPoint(point)是一个用于扩展Box2边界的方法。它通过检查一个给定的点是否位于Box2外部,如果是,则扩展Box2的最小点和最大点来包含该点。如果点已经在Box2内部,边界保持不变。
// 创建一个 Box2,定义最小点和最大点
const minVector = new THREE.Vector2(-1, -1);
const maxVector = new THREE.Vector2(1, 1);
const box = new THREE.Box2(minVector, maxVector);
// 定义一个位于 Box2 外部的点
const pointOutside = new THREE.Vector2(2, 2);
// 扩展 Box2,使其包含该点
box.expandByPoint(pointOutside);
console.log("New min point:", box.min); // Vector2(-1, -1)
console.log("New max point:", box.max); // Vector2(2, 2)
- expandByScalar ( scalar : Float ) : this
THREE.Box2.expandByScalar(scalar)是一个方法,用于以均匀的方式扩展Box2的边界。它会将Box2的最小点减去标量值,将最大点加上标量值,从而在所有方向上扩展边界。 如果你使用负数作为标量值,Box2会相应地缩小。
// 创建一个 Box2,定义最小点和最大点
const minVector = new THREE.Vector2(-1, -1);
const maxVector = new THREE.Vector2(1, 1);
const box = new THREE.Box2(minVector, maxVector);
// 扩展 Box2 的边界,每个方向扩展 1 单位
box.expandByScalar(1);
console.log("New min point:", box.min); // Vector2(-2, -2)
console.log("New max point:", box.max); // Vector2(2, 2)
- getCenter ( target : Vector2 ) : Vector2
THREE.Box2.getCenter()是一个方法,用于计算并返回Box2的中心点。它通过取Box2的最小点和最大点的中点来确定这个中心位置。 - getParameter ( point : Vector2, target : Vector2 ) : Vector2
THREE.Box2.getParameter(point, target)是一个方法,用于计算给定点在Box2边界中的参数位置,并将结果存储在指定的目标Vector2中。这个参数位置是基于Box2的最小和最大边界进行线性插值计算的,返回的是一个归一化坐标,表示该点在Box2的位置。
// 创建一个 Box2,定义最小点和最大点
const minVector = new THREE.Vector2(-1, -1);
const maxVector = new THREE.Vector2(1, 1);
const box = new THREE.Box2(minVector, maxVector);
// 定义一个点
const point = new THREE.Vector2(0.5, 0.5);
// 定义一个目标 Vector2 用于存储结果
const target = new THREE.Vector2();
// 获取该点在 Box2 中的参数位置并存储在 target 中
box.getParameter(point, target);
console.log("Parameter position:", target); // Vector2(0.75, 0.75)
// 定义一个在 Box2 外部的点
const outsidePoint = new THREE.Vector2(2, 2);
const outsideTarget = new THREE.Vector2();
box.getParameter(outsidePoint, outsideTarget);
console.log("Parameter position of outside point:", outsideTarget); // 可能不在有效范围内,结果取决于实现
- getSize ( target : Vector2 ) : Vector2
THREE.Box2.getSize(target)是一个方法,用于计算Box2的大小(即宽度和高度),并将结果存储在指定的目标Vector2中。该方法返回一个表示Box2尺寸的Vector2对象,尺寸是通过计算max边界和min边界之间的差值得到的。
// 创建一个 Box2,定义最小点和最大点
const minVector = new THREE.Vector2(-1, -1);
const maxVector = new THREE.Vector2(2, 3);
const box = new THREE.Box2(minVector, maxVector);
// 定义一个目标 Vector2 用于存储结果
const size = new THREE.Vector2();
// 获取 Box2 的大小并存储在 size 中
box.getSize(size);
console.log("Size of Box2:", size); // Vector2(3, 4)
- intersect ( box : Box2 ) : this
THREE.Box2.intersect(box)是一个方法,用于计算当前Box2与另一个Box2的交集,并将结果更新到当前Box2对象中。如果两个Box2相交,方法将返回相交区域的Box2,否则将返回一个空的Box2。
// 创建两个 Box2 对象
const boxA = new THREE.Box2(new THREE.Vector2(0, 0), new THREE.Vector2(3, 3));
const boxB = new THREE.Box2(new THREE.Vector2(2, 2), new THREE.Vector2(5, 5));
// 输出初始的 Box2
console.log("Box A:", boxA);
console.log("Box B:", boxB);
// 计算交集并更新 boxA
boxA.intersect(boxB);
console.log("Intersection of Box A and Box B:", boxA); // 应该输出 Box2(2, 2) 到 Box2(3, 3)
- intersectsBox ( box : Box2 ) : Boolean box - 用来检查相交的盒子。 确定该盒子是否和其相交。
- isEmpty () : Boolean 如果这个盒子包含0个顶点,则返回true。 请注意,一个下上边界相等的的盒子仍然包括一个点,一个两个边界共享的点。
- makeEmpty () : this 使此盒子为空。
- set ( min : Vector2, max : Vector2 ) : this min - (必须) 表示该盒子的下边界(x, y)。 max - (必须) 表示该盒子的上边界(x, y)。 设置这个盒子的上下(x, y)的界限。 请注意,此方法仅复制给定对象的值。
- setFromCenterAndSize ( center : Vector2, size : Vector2 ) : this
THREE.Box2.setFromCenterAndSize(center, size)是一个方法,用于根据给定的中心点和大小设置Box2的边界。这个方法会更新当前的Box2对象,使其的中心位置为指定的center,并根据size确定其宽度和高度。
// 创建一个 Box2 对象
const box = new THREE.Box2();
// 定义中心点和大小
const center = new THREE.Vector2(2, 2);
const size = new THREE.Vector2(4, 6);
// 设置 Box2 的边界
box.setFromCenterAndSize(center, size);
console.log("Box2:", box); // Box2(min: Vector2(0, -1), max: Vector2(4, 5))
- setFromPoints ( points : Array ) : this points - 点的集合,由这些点确定的空间将被盒子包围。 设置这个盒子的上下边界,来包含所有设置在points参数中的点。
- translate ( offset : Vector2 ) : this offset - 偏移方向和距离。 添加 offset 到这个盒子的上下边界,实际上在2D空间移动这个盒子offset个单位。
- union ( box : Box2 ) : this box - 将要与该盒子联合的盒子 在box参数的上边界和该盒子的上边界之间取较大者,而对两者的下边界取较小者,这样获得一个新的较大的联合盒子。