2014-06-27 54 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); 
相關問題