2013-01-02 27 views
2

我試圖檢測用戶何時點擊了我的3D場景中的特定多維數據集 我已經看到一些類似的問題,但沒有一個與我有相似的問題。Three.js raycast生成空相交數組

我有一個立方體的3D數組,填充和顯示正常,但是當我的鼠標放下函數被調用時,相交數組總是空的 - 我看不出有什麼問題,並希望得到任何幫助。

我的渲​​染器設置像這樣:

function setupRenderer() 
{ 
    renderer = new THREE.WebGLRenderer({antialias: true}); 
    renderer.setSize(window.innerWidth, window.innerHeight); 
    renderer.setClearColorHex(0xEEEEEE, 1); 
    renderer.domElement.addEventListener('mousedown', onDocumentMouseMove, false); 
    $('body').append(renderer.domElement); 
} 

和事件處理程序是:

function onDocumentMouseDown(event) 
{ 
    console.log("mouse clicked!"); 
    event.preventDefault(); 
    if(event.target == renderer.domElement) 
    { 
     var mouseX = (event.clientX/window.innerWidth)*2-1; 
     var mouseY = -(event.clientY /window.innerHeight)*2+1; 

     var vector = new THREE.Vector3(mouseX, mouseY, 0.5); 
     projector.unprojectVector(vector, camera); 

     var raycaster = new THREE.Raycaster(camera.position, vector.subSelf(camera.position).normalize()); 
     var intersects = raycaster.intersectObjects(cubes); 
     console.log("intersects.length: " + intersects.length); 
     if (intersects.length > 0) { 
      console.log("intersected objects"); 
      /* do stuff */ 
     } 
    } 
} 

您可以在http://kev-adsett.co.uk/experiments/three.js/experiment1/

回答

8

在行動中看到當前的項目,則需要通過在一個單一的對象數組中

var intersects = raycaster.intersectObjects(objects); 

如果對象數組是分層(即對象之一有一個孩子),那麼你需要指定它是這樣的:

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

您也可以通過在scene.children

此功能不適用於您的「立方體」數據結構。

three.js r.54

+1

ahh ok我沒有意識到傳入intersectObjects函數的數組必須是單個數組。這真的很有幫助,謝謝你的快速回復@WestLangley。也許如果我將我的數組重構爲兩個不同的單個數組,多維數據集網格之一以及存儲其位置的Vector3對象之一,那麼我可以將網格數組傳遞給intersectObjects函數。我會在午餐時嘗試這個,並報告回來! – kevatron400

+0

嗚!兩個陣列的解決方案非常感謝。 (實際上,此時位置數組是不需要的,但我認爲當我開始改變立方體的位置時,這將是必需的)。 – kevatron400

+1

我在場景中有不斷移動的元素,當時這不起作用......所以有什麼方法可以與移動元素相交? – Smit