You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断点是否位于Three.js中创建的立方体内部?

判断点是否在Three.js创建的立方体内部

嘿,这个问题其实挺容易解决的!先看你的代码:你创建的是一个1x1x1的轴对齐立方体(没有旋转、缩放,只是设置了位置),我们分两种情况来处理——一种是针对当前无旋转缩放的简单场景,另一种是通用的、支持任意变换的方法。

方法一:直接计算世界坐标边界(适合无旋转/缩放的情况)

你的立方体用BoxGeometry(1,1,1)创建,所以它在自身本地坐标系里的范围是从(-0.5, -0.5, -0.5)到(0.5, 0.5, 0.5)。当你把它放到场景中的p(x,y,z)位置后,它在世界坐标系里的边界就是位置加上这个本地范围。

直接写判断函数就行:

function isPointInsideCube(cube, pointA) {
    const halfSize = 0.5; // 对应BoxGeometry的1/2尺寸
    // 计算立方体在世界空间的边界
    const minX = cube.position.x - halfSize;
    const maxX = cube.position.x + halfSize;
    const minY = cube.position.y - halfSize;
    const maxY = cube.position.y + halfSize;
    const minZ = cube.position.z - halfSize;
    const maxZ = cube.position.z + halfSize;

    // 判断点A是否在所有边界范围内
    return pointA.x >= minX && pointA.x <= maxX &&
           pointA.y >= minY && pointA.y <= maxY &&
           pointA.z >= minZ && pointA.z <= maxZ;
}

方法二:通用坐标转换法(支持旋转/缩放/平移)

如果以后你的立方体需要添加旋转、缩放变换,上面的方法就失效了。这时候可以用Three.js的矩阵变换,把要判断的点从世界坐标系转换到立方体的本地坐标系,再判断是否在本地范围内:

function isPointInsideCube(cube, pointA) {
    // 创建临时向量存储转换后的点
    const localPoint = new THREE.Vector3();
    // 用立方体的逆世界矩阵,把世界空间的点转成物体本地空间的点
    localPoint.copy(pointA).applyMatrix4(cube.matrixWorldInverse);

    // 判断是否在本地立方体的范围内(1x1x1的立方体本地范围是±0.5)
    return localPoint.x >= -0.5 && localPoint.x <= 0.5 &&
           localPoint.y >= -0.5 && localPoint.y <= 0.5 &&
           localPoint.z >= -0.5 && localPoint.z <= 0.5;
}

小提示:如果你的立方体不是1x1x1,比如用BoxGeometry(w, h, d)创建,那本地范围就是(-w/2, -h/2, -d/2)到(w/2, h/2, d/2),记得把代码里的0.5换成对应尺寸的一半就行。

怎么用?比如你有个点const pointA = new THREE.Vector3(2, 3, 4),直接调用isPointInsideCube(cube, pointA)就能拿到布尔结果啦。

内容的提问来源于stack exchange,提问作者Mandroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:55:50