Используете Raycaster для получения координат пересечения с точки зрения игрока?

У меня проблемы с получением координат того, где игрок смотрит в мире, с помощью Raycaster. Он не набирает обороты ни на каких перекрестках.

В частности, я пытаюсь получить координаты пересечения на местности, которая состоит из нескольких сеток BufferGeometry. Вот код, который я использую, взятый из примера Raycaster: (groupedMeshes массив хранит сетки BufferGeometry )

var mouseX = ( event.clientX / window.innerWidth ) * 2 - 1;
var mouseY = -( event.clientY / window.innerHeight ) * 2 + 1;

var vector = new THREE.Vector3( mouseX, mouseY, camera.near );

// Convert the [-1, 1] screen coordinate into a world coordinate on the near plane
var projector = new THREE.Projector();
projector.unprojectVector( vector, camera );

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

// See if the ray from the camera into the world hits one of our meshes
var intersects = raycaster.intersectObject( groupedMeshes );
lastIntersects = intersects;

if ( intersects.length > 0 ) {
    console.log("Intersection!");
}

И изображение, показывающее вид игрока:
(Красная точка, поясняющая, что я хочу направить луч из центра камеры на местность)

введите описание изображения здесь

Мышь / указатель заблокированы (вид камеры от первого лица), поэтому я предполагаю, что хочу проверить пересечение в центре экрана? В приведенном выше коде этого не происходит, поэтому я тестировал без блокировки указателя.

Если бы кто-нибудь мог понять, почему он не обнаруживает никаких пересечений, я был бы очень признателен за помощь. Спасибо.


РЕДАКТИРОВАТЬ:
Кажется, я должен использовать raycaster.intersectObjects( groupedMeshes );, а не raycaster.intersectObject( groupedMeshes );. Виноват.

Итак, мой единственный вопрос сейчас - как мне направить луч с точки зрения игрока (от первого лица) на местность. Спасибо!

РЕДАКТИРОВАТЬ2:

var vector = new THREE.Vector3( 0, 0, 0.5 );

var projector = new THREE.Projector();
projector.unprojectVector( vector, camera );

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

var intersects = raycaster.intersectObjects( groupedMeshes );
lastIntersects = intersects;

if ( intersects.length > 0 ) {
    console.log(intersects);
}

person Joey Morani    schedule 16.03.2014    source источник
comment
Пример three.js, на который вы ссылались, похоже, нуждается в обновлении ... В любом случае, если я понимаю, что вы хотите сделать, попробуйте var vector = new THREE.Vector3( 0, 0, 0.5 ) всегда использовать raycast из центра экрана. Также посмотрите, можете ли вы переписать свой код, чтобы избежать «нового» в цикле рендеринга, то есть повторно использовать свои объекты.   -  person WestLangley    schedule 16.03.2014
comment
Да, код используется в событии MouseDown. По сути, это попытка получить координаты блока, на который смотрит игрок, а затем удалить его при щелчке мышью (в стиле Minecraft). AFAIK, съемка луча из центра экрана туда, куда смотрит камера, позволила бы мне получить эти координаты. Использование кода в новом редактировании вызывает некоторые пересечения, но, похоже, это не то место, куда игрок смотрит. (Может вообще не смотреться сетка, и все равно скажет, что есть пересечение) Должен ли это включать просмотр вращения камеры? Спасибо.   -  person Joey Morani    schedule 16.03.2014
comment
Лучший учебник, который я нашел и использовал по выбору объектов: soledadpenades.com/articles / three-js-tutorials / object-picking   -  person Farzad    schedule 16.03.2014
comment
Вы можете привести простой живой пример?   -  person WestLangley    schedule 16.03.2014
comment
Разобрался и добавил ответ. Спасибо, в любом случае! :)   -  person Joey Morani    schedule 17.03.2014


Ответы (1)


Решил это, посмотрев на этот пример скрипта.

Теперь я использую это, что позволяет мне стрелять лучом из местоположения камеры в направлении, в котором смотрит игрок / камера:

var raycaster = new THREE.Raycaster();
var direction = new THREE.Vector3( 0, 0, -1 );
var rotation = new THREE.Euler( 0, 0, 0, "YXZ" );

function shootRay() {
    rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );

    raycaster.ray.direction.copy( direction ).applyEuler( rotation );
    raycaster.ray.origin.copy( yawObject.position );

    var intersections = raycaster.intersectObjects( groupedMeshes );
    if ( intersections.length > 0 ) {
        console.log(intersections[0].point);
    }
}
person Joey Morani    schedule 17.03.2014
comment
что такое объект по тангажу и рысканью? - person Uzumaki Naruto; 04.08.2017