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
Javascript Three.js Raycaster未检测场景网格_Javascript_Three.js_Mesh_Raycasting - Fatal编程技术网

Javascript Three.js Raycaster未检测场景网格

Javascript Three.js Raycaster未检测场景网格,javascript,three.js,mesh,raycasting,Javascript,Three.js,Mesh,Raycasting,我在Chrome版本35.0.1916.153 m中使用了three.js r67 我正在尝试与我在场景中创建的一些自定义网格相交。虽然网格存在于scene.children中,但光线投射器似乎没有注册网格 网格创建代码: if (modelVertices != null && modelVertices.length >= 3) { triangles = THREE.Shape.Utils.triangulateShape ( modelVer

我在Chrome版本35.0.1916.153 m中使用了three.js r67

我正在尝试与我在场景中创建的一些自定义网格相交。虽然网格存在于scene.children中,但光线投射器似乎没有注册网格

网格创建代码:

if (modelVertices != null && modelVertices.length >= 3) {
            triangles = THREE.Shape.Utils.triangulateShape ( modelVertices, holes );

            for( var i = 0; i < triangles.length; i++ ){

               modelGeometry.faces.push( new THREE.Face3( triangles[i][0], triangles[i][2], triangles[i][2] ));

                }

            modelGeometry.computeFaceNormals();
            var modelMesh = new THREE.Mesh(modelGeometry, material);
            modelMesh.material.side = THREE.DoubleSide;
            polyhedralzGroup.add(modelMesh)
    }
在代码中,我使用computeFaceNormals();所以这不是问题所在(请参阅)。奇怪的是,场景似乎与我使用简单三角形(即不使用THREE.Shape.Utils.triangulateShape;只需手动推三角形顶点和面)构建的其他几何体相交,这意味着如果不考虑相交时的画布偏移,就不会出现问题。我检查了这两种几何结构,它们之间似乎没有任何根本的区别


有人知道问题是什么吗?

问题在于顶点的构造方式:使用字符串。尽管three.js允许您构造顶点(因此也包括几何体和网格),然后使用字符串显示几何体,但它不允许您将这些顶点用于光线投射。更简洁地说,这个问题可以归结为:

更改此选项:

aVertex = new THREE.Vector3( part[0], part[1] , part[2] );
为此:

aVertex = new THREE.Vector3( parseFloat(part[0]), parseFloat(part[1]) , parseFloat(part[2]) );

我不确定这是一个bug还是一个功能,因为在使用字符串格式的顶点时似乎不会抛出错误,尽管不能对具有字符串顶点几何体的对象进行光线投射(可能是因为无法计算法线?)。

您的问题是将scene.children传递给光线投射器

 var intersects = raycaster.intersectObjects( scene.children, true );
解决方案1。 在对象中加载模型

var objects = [];

objects.push(mesh);
然后

var intersects = raycaster.intersectObjects( objects, true );
解决方案1

在第二个场景中传递对象,并将其传递给光线投射器

var scene_2

scene_2 = new THREE.Scene();
scene.add(scene_2);
scene_2.add(mesh);

var intersects = raycaster.intersectObjects( scene_2, true );

这不是一个解决办法。在您的示例中,
scene.children
objects
将指向完全相同的对象。
var scene_2

scene_2 = new THREE.Scene();
scene.add(scene_2);
scene_2.add(mesh);

var intersects = raycaster.intersectObjects( scene_2, true );