THREE.js получить координаты GridHelper с помощью щелчка мыши

#three.js #coordinate-systems

#three.js #системы координат

Вопрос:

Как я могу получить координату — или В — GridHelper того, на что я нажимаю? Особенно, когда на вершине? Mesh GridHelper

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

Мой GridHelper настроен следующим образом:

 let  helperGrid = new THREE.GridHelper(600, 120, "yellow", “blue”);
 

Таким образом, расстояние между каждой линией сетки равно 5 (причина 600/12 = 5)

Когда я щелкаю по экрану, я хотел бы знать, в какой части Сетки я щелкнул. Например, я щелкнул где-нибудь в самом первом квадрате? Что означает щелчок (для значения X) в любом месте между (0, 0, 0) и (5, 0, 0), а для Z-значений в любом месте между (0, 0, 0) и (0, 0, -5)?

Я собирался попытаться вычислить это, используя мои координаты, которые я вычисляю с помощью mousedown события, обычным способом:

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

Но это приводит к действительно крошечным десятичным числам. Например, когда я щелкаю в любом месте самого первого поля сетки, то есть между x = 0 и x = 5, я получаю значения положения мыши, такие как:

  ( 0.07309721175584016 , 0.03186646433990892 )
 

или:

 ( 0.09269027882441594 , 0.02427921092564489 )
 

и т.д.

Между тем, соответствующие event.clientX event.clientY значения и — для того же самого события касания — следующие:

 clientXY = ( 740 , 634 ) 
 

Таким образом, ни один из наборов значений, похоже, не указывает мне в правильном направлении.

Помимо всего этого, я хотел бы в конечном итоге разместить ландшафт над этой сеткой, что означает, что rayCaster Я использую will catch вершину Местности Mesh , которую я создаю, что может еще больше усложнить проблему.

Как правильно поступить с этим?

Ответ №1:

Уже есть демонстрация с вашим точным сценарием: Raycasting с сеткой местности (нажмите на значок в правом нижнем <> углу, чтобы просмотреть источник).

Когда raycast пересекается с сеткой terrain, он вернет объект со следующими свойствами, как описано в документации: { distance, point, face, faceIndex, object } , поэтому, если вы хотите узнать x, z координаты того места, где вы зависли, просто посмотрите на .point свойство пересекаемого объекта:

 function onMouseMove( event ) {

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

    // Perform raycast
    raycaster.setFromCamera( mouse, camera );

    // See if the ray from the camera into the world hits our mesh
    const intersects = raycaster.intersectObject( terrainMesh );

    // Check if an intersection took place
    if ( intersects.length > 0 ) {
        const posX = intersects[0].point.x;
        const posZ = intersects[0].point.z;
        console.log(posX, posZ);
    }

}
 

Наконец, если вы хотите узнать позицию с шагом в 5 единиц, просто выполните небольшой трюк с округлением:

 const posX = Math.round(intersects[0].point.x / 5) * 5;
const posZ = Math.round(intersects[0].point.z / 5) * 5;