2014-10-30 5 views
3

Я пытаюсь выбрать объекты в сцене, где я использую орфографическую камеру. мой фрагмент кода уже работает, но он не является точным. Я уже нашел ответы на stackoverflow, но они устарели или больше не будут работать. вот мой код OnMouseDown3d.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

Вот шаблон для использования при raycasting (собирание) либо с орфографической камерой или перспективной камерой:

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

+0

@WestLangley Я также борюсь с орто камерой и пересекаюсь. Но ваш [другой ответ] (http://stackoverflow.com/a/18553739/1697459) отличается. Почему это, я что-то упускаю? Есть ли официальная документация ThreeJS? – Wilt

+0

@Wilt Обновлен другой ответ. Благодарю. См. Примеры three.js. – WestLangley