У меня проблемы с получением координат того, где игрок смотрит в мире, с помощью 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);
}
var vector = new THREE.Vector3( 0, 0, 0.5 )
всегда использовать raycast из центра экрана. Также посмотрите, можете ли вы переписать свой код, чтобы избежать «нового» в цикле рендеринга, то есть повторно использовать свои объекты. - person WestLangley   schedule 16.03.2014