如何判断点是否位于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
相关产品推荐
相关产品推荐

