Ортогональный выбор объекта камеры в three.js

Я пытаюсь выбрать объекты в сцене, где я использую ортогональную камеру. мой фрагмент кода уже работает, но он не точен. Я уже нашел несколько ответов на stackoverflow, но они устарели или больше не будут работать. вот мой код onMouseDown

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.

любые подсказки будут очень признательны. спасибо, ура!


person kampfgnu    schedule 30.10.2014    source источник


Ответы (1)


Вот шаблон, который следует использовать при рейкастинге (пикировании) с помощью ортогональной или перспективной камеры:

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

person WestLangley    schedule 30.10.2014
comment
@WestLangley Я тоже борюсь с орто камерой и пересекаюсь. Но ваш другой ответ отличается. Почему это? Я что-то упускаю? Есть ли по этому поводу официальная документация ThreeJS? - person Wilt; 12.12.2014
comment
@Wilt Обновил другой ответ. Спасибо. См. Примеры three.js. - person WestLangley; 12.12.2014