2014-10-30 93 views
3

我想挑選一個場景中的對象,我使用正交相機。我的代碼片段已經工作,但它不是精確的。 我已經在stackoverflow上找到了一些答案,但是這些已被棄用或不再工作了。 這裏是我的代碼onmousedown事件three.js正射相機對象拾取

function onDocumentMouseUp(event) { 
    event.preventDefault(); 

    mouse.x = (event.clientX/window.innerWidth) * 2 - 1; 
    mouse.y = - (event.clientY/window.innerHeight) * 2 + 1; 

    var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5); 
    var pos = camera.position; 
    var ray = new THREE.Raycaster(pos, vector.unproject(camera).sub(camera.position).normalize()); 

    var intersects = ray.intersectObjects(objects); 

    if (intersects.length > 0) { 
     console.log("touched:" + intersects[0]); 
    } 
    else { 
     console.log("not touched"); 
    } 
} 

請參閱http://jsfiddle.net/ujzpe07t/1/

,如果你點擊即可左/右/上/立方以下,但它仍然告訴我,該對象被感動了一些像素。

我正在使用three.js r69。

任何提示將非常感激。 謝謝,歡呼!

回答

9

這裏是光線投射時(採摘)與任一正視相機或透視相機使用模式:

var raycaster = new THREE.Raycaster(); // create once 
var mouse = new THREE.Vector2(); // create once 

... 

mouse.x = (event.clientX/renderer.domElement.clientWidth) * 2 - 1; 
mouse.y = - (event.clientY/renderer.domElement.clientHeight) * 2 + 1; 

raycaster.setFromCamera(mouse, camera); 

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

three.js所r.84

+1

真棒,你固定我的問題!謝啦! – kampfgnu 2014-10-30 15:31:21

+0

@WestLangley我也在與ortho相機戰鬥並相交。但是你的[其他答案](http://stackoverflow.com/a/18553739/1697459)是不同的。爲什麼這是我錯過了什麼?有沒有官方的ThreeJS文檔? – Wilt 2014-12-12 15:26:32

+0

@Wilt更新了其他答案。謝謝。請參閱three.js示例。 – WestLangley 2014-12-12 18:05:21