three.js PlaneGeometry和相交对象
在three.js PlaneGeometry和相交对象,three.js,Three.js,在three.js中,我创建了一个平面: var planGeom = new THREE.PlaneGeometry( 5,5,1,1 ); var planMat = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} ); var plan = new THREE.Mesh( planGeom, planMat ); 然后设置顶点坐标: for(var i=0;i<4;i++){ pl
three.js
中,我创建了一个平面:
var planGeom = new THREE.PlaneGeometry( 5,5,1,1 );
var planMat = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );
var plan = new THREE.Mesh( planGeom, planMat );
然后设置顶点坐标:
for(var i=0;i<4;i++){
planGeom .vertices[i].x = myCoordsTab[i].x;
planGeom .vertices[i].y = myCoordsTab[i].y;
planGeom .vertices[i].z = myCoordsTab[i].z;
}
平面在3D场景中显示在良好位置,但当我输出其位置时:
console.log(plan.position.x+' '+plan.position.y+' '+plan.position.z);
我得到(0,0,0)
然后,当我尝试检查是否用以下命令单击该平面时:
var vector = new THREE.Vector3( mousex, mousey, 0.5 );
projector = new THREE.Projector();
projector.unprojectVector( vector, camera );
var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
var intersects = ray.intersectObjects( scene.children );
它总是返回我在平面上单击的结果,无论我在场景中单击的位置。
例如,我可以用球墨仪检查咔哒声
那么,如果平面几何体(显然)始终保持在(0,0,0)位置(这使得所有单击都被视为在平面上),如何检查该几何体上的单击
我使用的是three.js 53,我知道这是一个非常旧的版本,但我在一个很早以前就开始的大项目中工作,而且上一个版本有太多的东西需要更改,所以我希望这个问题可以在53版本中得到解决
编辑:
使用
plan.geometry.verticesNeedUpdate = true;
plan.geometry.computeCentroids();
我现在有了一些有效的方法,但并非在所有情况下都有效。
我有:
如果我这样定义平面几何体的顶点:
planGeom .vertices[0].x = 50;
planGeom .vertices[0].y = 20;
planGeom .vertices[0].z = -20;
planGeom .vertices[1].x = 50;
planGeom .vertices[1].y = 20;
planGeom .vertices[1].z = 20;
planGeom .vertices[2].x = 50;
planGeom .vertices[2].y = -20;
planGeom .vertices[2].z = -20;
planGeom .vertices[3].x = 50;
planGeom .vertices[3].y = -20;
planGeom .vertices[3].z = 20;
该平面位于摄影机前面(距离为50,我可以看到整个平面),intersectObjects返回我在场景中单击的任何位置单击该平面的结果,并返回每次单击的结果:
(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z) = (0, 0, 0)
但如果我这样定义:
planGeom .vertices[0].x = -20;
planGeom .vertices[0].y = 20;
planGeom .vertices[0].z = -50;
planGeom .vertices[1].x = 20;
planGeom .vertices[1].y = 20;
planGeom .vertices[1].z = -50;
planGeom .vertices[2].x = -20;
planGeom .vertices[2].y = -20;
planGeom .vertices[2].z = -50;
planGeom .vertices[3].x = 20;
planGeom .vertices[3].y = -20;
planGeom .vertices[3].z = -50;
该平面位于摄影机的左侧,intersectObjects仅在我单击该平面时返回我单击的三维点的坐标;单击每个角点即可返回相应顶点的坐标。例如:
(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z) = (planGeom .vertices[0].x, planGeom .vertices[0].y, planGeom .vertices[0].z)
在平面中心单击可提供:
(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z) = (0, 0, -50)
所以现在,我想知道为什么它在所有情况下都不起作用?我将做一个简单的例子,比所有这些解释都简单:)
编辑
下面是一个示例:首先在摄影机前面看到的平面在场景中的每次单击都返回一个交点。左侧的第二个平面(拖动场景以旋转)返回一个良好的交点。
编辑
工作代码:
事实上,缺少一条指示:
plan.geometry.verticesNeedUpdate = true;
plan.geometry.computeFaceNormals();//ok with that one
plan.geometry.computeCentroids();
对于交叉点检查,对象位置应该根本不重要。在这种情况下,几何图形更为重要。更新顶点数组后,应设置
plangome.verticesNeedUpdate=true代码>
您只是移动了平面局部坐标系中的顶点,而不是世界坐标系中的平面。因此,飞机的矩阵没有改变,您的console.log为您提供(0,0,0)
编辑:
也许光线投射器的矢量是错误的。mousex
和mousey
是否直接来自鼠标事件?我漏掉了那几行:
var mousex=(event.clientX/屏幕宽度)*2-1;
变量mousey=-(event.clientY/屏幕高度)*2+1;
var向量=新的三个向量3(mousex,mousey,0.5);
//如果画布没有填满页面
//您需要确定画布的偏移量,并将其视为如下
var mousex=((event.clientX-offsetX)/屏幕宽度)*2-1;
var mousey=-((event.clientY-offsetY)/屏幕高度)*2+1;
var向量=新的三个向量3(mousex,mousey,0.5);
对于交叉点检查,对象位置应该根本不重要。在这种情况下,几何图形更为重要。更新顶点数组后,应设置plangome.verticesNeedUpdate=true代码>
您只是移动了平面局部坐标系中的顶点,而不是世界坐标系中的平面。因此,飞机的矩阵没有改变,您的console.log为您提供(0,0,0)
编辑:
也许光线投射器的矢量是错误的。mousex
和mousey
是否直接来自鼠标事件?我漏掉了那几行:
var mousex=(event.clientX/屏幕宽度)*2-1;
变量mousey=-(event.clientY/屏幕高度)*2+1;
var向量=新的三个向量3(mousex,mousey,0.5);
//如果画布没有填满页面
//您需要确定画布的偏移量,并将其视为如下
var mousex=((event.clientX-offsetX)/屏幕宽度)*2-1;
var mousey=-((event.clientY-offsetY)/屏幕高度)*2+1;
var向量=新的三个向量3(mousex,mousey,0.5);
飞机的位置在(0,0,0)处是正确的,您认为“真实”位置是什么?我猜你只是想要在变形平面上进行光线投射时交点的世界位置?@FalkThiele事实上,我希望四边形的中心由新的四个顶点定义。我不明白为什么它是(0,0,0),因为平面几何似乎不是一个无限平面,而是一个空间有限的四边形。()您正在修改几何体的位置,该位置可能与网格的位置不同。您可以检索几何体的边界框
或边界球
的中心,如果这正是您要查找的。@FalkThiele不是我想要的。我编辑我的文章是为了更精确。飞机的位置在(0,0,0)是正确的,你认为“真实”的位置是什么?我猜你只是想要在变形平面上进行光线投射时交点的世界位置?@FalkThiele事实上,我希望四边形的中心由新的四个顶点定义。我不明白为什么它是(0,0,0),因为平面几何似乎不是一个无限平面,而是一个空间有限的四边形。()您正在修改几何体的位置,该位置可能与网格的位置不同。您可以检索几何体的边界框
或边界球
的中心,如果这正是您要查找的。@FalkThiele不是我想要的。为了更精确,我编辑了我的文章。我也编辑了我的文章。也许你的光线投射器矢量是错的。我检查了我的光线投射器矢量,它是好的。我用一个JSFIDLE链接编辑了我的文章,它将是eas
(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z) = (0, 0, -50)
plan.geometry.verticesNeedUpdate = true;
plan.geometry.computeFaceNormals();//ok with that one
plan.geometry.computeCentroids();