2014-06-27 39 views
1

我使用的Chrome版本35.0.1916.153米three.js所R67three.js所Raycaster未检测

我试图相交一些自定义的网格,我在我的场景创建场景目。 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

没有人有任何想法什么问题可能是什么?

回答

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

你的问题是你将scene.children传递给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); 
相关问题