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
Вы должны получить хиты на обеих поверхностях.