Three.js Raycaster.intersectObjects обнаруживает только пересечение на передней поверхности

Я создаю программу, которая заполняет мир блоками на земле при щелчке мыши (координата основана на координате щелчка мыши, которую я рассчитал). При создании нового блока он не должен пересекаться с уже созданными ранее. Я добился этой проверки с помощью THREE.Raycaster. В основном, я излучаю лучи из центра блока во всех направлениях его вершин.

var ln = preview.geometry.vertices.length;

//for each vertices we throw a ray
for(var i = 0; i < ln; i++){
    var pr_vertex = preview.geometry.vertices[i].clone();
    var gl_vertex = pr_vertex.applyMatrix4(preview.matrix);
    var dr_vector = gl_vertex.sub(preview.position);

    var ray = new THREE.Raycaster(preview.position, dr_vector.clone().normalize());
    var intersects = ray.intersectObjects(objmanager.getAllObject(), true);

    //if there is intersection
    if(intersects.length > 0 && intersects[0].distance < dr_vector.length()){
        //hide preview material
        preview.material.opacity = 0;
        //exit checking
        break;
    }
}

Предварительный просмотр - это имя объекта. Этот код уже работал отлично. Проблема в том, что Raycaster.intersectObjects работал только тогда, когда луч пересекается с лицевой стороной тестируемого объекта. Я проверял это, когда запускал код, если луч начинался снаружи тестируемого объекта, он просто пересекался. Но когда луч стартовал изнутри тестируемого блока, он не уловил пересечения с поверхностью тестируемого блока. Я предполагаю, что это происходит потому, что intersectObjects работал только с передней поверхностью тестируемого объекта. Это правда?

Интуитивно я пытался решить эту проблему с помощью THREE.DoubleSide (создание двухсторонних объектов). Но это привело к ошибке, потому что шейдер не смог инициализироваться.

Could not initialise shader
VALIDATE_STATUS: false, gl error [0] three.js:25254
    buildProgram three.js:25254
    initMaterial three.js:23760
    setProgram three.js:23830
    renderBuffer three.js:22371
    renderObjects three.js:23061
    render three.js:22935
    animLoop

Я использую ТРИ.MeshLambertMaterial. Когда я использовал MeshBasicMaterial, Raycaster.intersectObjects просто не работал вообще.

Итак, я сейчас нахожусь на контрольно-пропускном пункте. Есть ли идея решить эту проблему? Либо так, либо я должен был бы проверить столкновение вручную с отдельными гранями каждого объекта (что, боюсь, сильно повлияло бы на производительность).

Заранее спасибо.

===============

редактировать: я забыл упомянуть, я использую новейшую версию three.js, которая должна быть около r63

2 ответа

Если двусторонний, у вас будет два пересечения:

object.material.side = THREE.DoubleSide

Если вы установите:

object.material.side = THREE.DoubleSided

Вы должны получить хиты на обеих поверхностях.

Другие вопросы по тегам