验证点是否位于three.js中的立方体内

验证点是否位于three.js中的立方体内,three.js,Three.js,我已将多维数据集创建为: var cubeGeometry = new THREE.BoxGeometry( 1, 1, 1 ); var cubeMaterial = new THREE.MeshLambertMaterial( { color: 0xffff00,wireframe: true } ); var cube = new THREE.Mesh( cubeGeometry, cubeMaterial ); cube.position.x = p.x; cube.po

我已将多维数据集创建为:

var cubeGeometry = new THREE.BoxGeometry( 1, 1, 1 );
var cubeMaterial = new THREE.MeshLambertMaterial( { color: 
       0xffff00,wireframe: true } );
var cube = new THREE.Mesh( cubeGeometry, cubeMaterial );
cube.position.x = p.x;
cube.position.y = p.y;
cube.position.z = p.z;
scene.add(cube);
p是my函数的输入点。因此,这段代码在位置p处创建一个立方体,并将其添加到场景中

我如何检查某个点,比如说A,是否位于这个立方体内?对于Three.Mesh,我找不到任何辅助函数,如containsPoint等。我可能会做一些额外的检查来验证,但我正在寻找一个Three.js函数。

cube.updateMatrix()//确保对象矩阵与对象的位置/旋转/缩放保持一致。。。
cube.updateMatrixWorld(); //Make sure the object matrix is current with the position/rotation/scaling of the object...
var localPt = cube.worldToLocal(yourPoint.clone());  //Transform the point from world space into the objects space
if(Math.abs(localPt.x)<=0.5&&Math.abs(localPt.y)<=0.5&&Math.abs(localPt.z)<=0.5)
    console.log("Point is inside!"); //Check if all the axis are within the size of the cube.. if your cube sizes arent 1,1,1, you'll have to adjust these checks to be half of width/height/depth..
var localPt=cube.worldToLocal(yourPoint.clone())//将点从世界空间变换到对象空间 if(Math.abs(localPt.x)
cube.updateMatrix();//确保对象矩阵与对象的位置/旋转/缩放是最新的。。。
var localPt=cube.worldToLocal(yourPoint.clone());//将点从世界空间转换为对象空间

如果(Math.abs(localPt.x)可以创建
THREE.Box3()
实例,使用其
.setFromObject()
多维数据集作为参数,然后调用
.containsPoint()
,将要检查的点作为参数传递到此方法:

var scene=new THREE.scene();
var摄像机=新的三透视摄像机(60,window.innerWidth/window.innerHeight,11000);
摄像机。位置。设置(2,5,10);
var renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
添加(新的三个.GridHelper(10,10));
var cube=新的THREE.Mesh(新的THREE.BoxGeometry(2,2,2),新的THREE.MeshBasicMaterial({
颜色:“浅绿色”,
线框:正确
}));
立方体位置集(0,1,0);
场景.添加(立方体);
var pointA=新的三个向量3(0,1,0);
var pointB=新的三个向量3(2,1,0);
点(点A,0x00ff00);
点(点B,“黄色”);
功能点(点、颜色){
p=新的三网格(新的三网格球面法(0.25,4,2),新的三网格基本材料({
颜色:颜色
}));
p、 位置。复制(点);
场景。添加(p);
}
var bb=new THREE.Box3();//用于重复使用
bb.setFromObject(立方体);
控制台日志(bb);
log(bb.containsPoint(pointA),bb.containsPoint(pointB));
render();
函数render(){
请求动画帧(渲染);
渲染器。渲染(场景、摄影机);
}
正文{
溢出:隐藏;
保证金:0;
}

您可以创建
THREE.Box3()
实例,使用其
.setFromObject()
多维数据集作为参数,然后调用
.containsPoint()
,将要检查的点作为参数传递到此方法:

var scene=new THREE.scene();
var摄像机=新的三透视摄像机(60,window.innerWidth/window.innerHeight,11000);
摄像机。位置。设置(2,5,10);
var renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
添加(新的三个.GridHelper(10,10));
var cube=新的THREE.Mesh(新的THREE.BoxGeometry(2,2,2),新的THREE.MeshBasicMaterial({
颜色:“浅绿色”,
线框:正确
}));
立方体位置集(0,1,0);
场景.添加(立方体);
var pointA=新的三个向量3(0,1,0);
var pointB=新的三个向量3(2,1,0);
点(点A,0x00ff00);
点(点B,“黄色”);
功能点(点、颜色){
p=新的三网格(新的三网格球面法(0.25,4,2),新的三网格基本材料({
颜色:颜色
}));
p、 位置。复制(点);
场景。添加(p);
}
var bb=new THREE.Box3();//用于重复使用
bb.setFromObject(立方体);
控制台日志(bb);
log(bb.containsPoint(pointA),bb.containsPoint(pointB));
render();
函数render(){
请求动画帧(渲染);
渲染器。渲染(场景、摄影机);
}
正文{
溢出:隐藏;
保证金:0;
}

@prisoner849 如果旋转长方体,则解决方案不起作用。 这是问题的一个例子。我呈现了两种解决方案,你可以看到Box3版本在哪里随着旋转的立方体而断裂,而分析的once有效

var scene=new THREE.scene();
var摄像机=新的三透视摄像机(60,window.innerWidth/window.innerHeight,11000);
摄像机。位置。设置(2,5,10);
var renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
添加(新的三个.GridHelper(10,10));
var boxDimensions=新的三个向量3(2,2,2);
var cube=新的THREE.Mesh(新的THREE.BoxGeometry(boxDimensions.x,boxDimensions.y,boxDimensions.z)),新的THREE.MeshBasicMaterial({
颜色:“浅绿色”,
线框:正确
}));
立方体位置集(0,1,0);
cube.rotation.y=Math.PI*0.25;
场景.添加(立方体);
var pointA=新的三个向量3(0.95,0.95,0.95);
var pointC=新的三个向量3(-0.65,0.65,-0.65);
var pa=点(点A,0x00ff00);
var pc=点(点C,0x00ff00);
功能点(点、颜色){
p=新的三网格(新的三网格球面法(0.25,4,2),新的三网格基本材料({
颜色:颜色
}));
p、 位置。复制(点);
场景。添加(p);
返回p;
}
var bb=new THREE.Box3();//用于重复使用
bb.setFromObject(立方体);
控制台日志(bb);
功能校正点收件箱(pt、多维数据集、boxDim){
cube.updateMatrix();//确保对象矩阵与对象的位置/旋转/缩放保持一致。。。
var localPt=cube.worldToLocal(pt.clone());//将点从世界空间转换为对象空间
if(Math.abs(localPt.x)@prisoner849
如果旋转长方体,则解决方案不起作用。
这是问题的一个例子。我呈现了两种解决方案,你可以看到Box3版本在哪里随着旋转的立方体而断裂,而分析的once有效

var scene=new THREE.scene();
var摄像头=新的三个透视摄像头(60,窗口。内部宽度/win