Three.js Raycaster没有检测到场景网格

时间:2014-06-27 14:05:30

标签: javascript three.js mesh raycasting

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

我试图与我在场景中创建的一些自定义网格相交。 raycaster似乎没有注册网格,尽管它们存在于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)
    }

光线投射代码:

                var projector = new THREE.Projector();
                projector.unprojectVector( vector, camera );

                var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
                //console.log("Work");
                // See if the ray from the camera into the world hits one of our meshes

                var intersects = raycaster.intersectObjects( scene.children, true );
                helper.position.set( 0, 0, 0 );
                //console.log(intersects.length);
                if ( intersects.length > 0 ) {  
                    if (intersects[ 0 ].face != null) {
                    helper.lookAt( intersects[ 0 ].face.normal );
                    helper.position.copy( intersects[ 0 ].point ); 
}

在代码中,我使用的是computeFaceNormals();所以这不是问题(见here)。奇怪的是,场景似乎与我使用简单三角形构建的其他几何相交(即不使用THREE.Shape.Utils.triangulateShape;只需手动推三角形顶点和面)完全正常,这意味着这不能是一个没有考虑相交的画布偏移的问题。我检查了两种几何形状,两者之间似乎没有任何根本差异。

Example of object not being intersected

有没有人对这个问题有什么想法?

2 个答案:

答案 0 :(得分:3)

问题与顶点构造方式的事实有关:使用字符串。虽然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]) );

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

答案 1 :(得分:2)

你的问题是你把场景传给了raycaster。

 var intersects = raycaster.intersectObjects( scene.children, true );

解决方案1。 将模型加载到对象中

var objects = [];

objects.push(mesh);

然后

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

解决方案1.

在第二个场景中传递您的对象并将其传递给您的raycaster

var scene_2

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

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