three Box2 数据库

260 阅读8分钟

THREE.Box2 是 Three.js 中用来表示二维轴对齐边界框(AABB)的类。它通常用于碰撞检测或定义一个平面上的包围区域。

需要注意的是所有的方法都是根据 min 与 max 的点来确定的,这两个是基础 例如 new THREE.Box2(min,max) 才会有下列的属性与方法

getParameter 使用这个时要注意计算参数的方式 1728443336775.png

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参数的上边界和该盒子的上边界之间取较大者,而对两者的下边界取较小者,这样获得一个新的较大的联合盒子。