Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
three.js PlaneGeometry和相交对象_Three.js - Fatal编程技术网

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();