2013-08-17 85 views
4

我有一個問題檢測對象與THREE.js交集。我的對象正在從2D幾何體擠壓喜歡這樣:與交叉對象THREE.js問題

var geoShape = new THREE.Shape(vertexes); 
var geometry = new THREE.ExtrudeGeometry(geoShape, { bevelEnabled: false, amount: 3 }); 

var mesh = THREE.SceneUtils.createMultiMaterialObject(geometry, 
    [new THREE.MeshLambertMaterial({ color: '#493D26' })] 
); 
scene.add(mesh); 

我再試圖檢測這樣的交集:

container.mousedown(function (e) { 

    event.preventDefault(); 

    var vector = new THREE.Vector3((e.clientX/window.innerWidth) * 2 - 1, -(e.clientY/window.innerHeight) * 2 + 1, 0.5); 
    projector.unprojectVector(vector, camera); 

    var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize()); 

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

    console.log(intersects); 
}); 

每次,我相交數組爲空。如果我在場景中添加一個球體,我會得到十字路口,但只有當我放大到z < 18.任何建議?

+0

您的畫布元素是全屏嗎? – uhura

+0

@uhura現在,是的。我稍後可能會改變這一點,但當我談到它時,我可以處理這個問題。 – mrK

+0

嘗試將true添加到'raycaster.intersectObjects(scene.children,true);' – uhura

回答

8

添加真實

raycaster.intersectObjects(scene.children, true); 

從文檔:

遞歸(true) - 如果設置,它還會檢查所有後代。否則, 它只檢查與對象的交點。

3

有幾件事情可能會導致raycaster無法正確構建,調試它的最佳方法並確保您的raycaster是正確的,我建議您使用raycaster.ray.origin和raycaster.ray.direction,線可以很容易地得出這樣在相同的鼠標事件應該檢測的交叉點:

var material = new THREE.LineBasicMaterial({ 
    color: 0x0000ff 
}); 
var geometry = new THREE.Geometry(); 

geometry.vertices.push(new THREE.Vector3(raycaster.ray.origin.x, raycaster.ray.origin.y, raycaster.ray.origin.z)); 
geometry.vertices.push(new THREE.Vector3(raycaster.ray.origin.x + (raycaster.ray.direction.x * 100000), raycaster.ray.origin.y + (raycaster.ray.direction.y * 100000), raycaster.ray.origin.z + (raycaster.ray.direction.z * 100000))); 
var line = new THREE.Line(geometry, material); 

注意:考慮到的是,光線將被可視化只是如果攝像機視點變了!

0

對我來說,解決方案是妮歐塔·烏乎拉的答案...

raycaster.intersectObjects(scene.children, true); 

... PLUS實現了該raycaster 生成所有路口的陣列,而不只是第一個。我的代碼遍歷所有交叉點並顯示最後一個,當時我只想要第一個。所以...

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

if(intersects.length > 0) 
{ 
//Do something with intersects[0]; 
}