Three.JS - Raycasting на пользовательской сетке - PullRequest
1 голос
/ 11 ноября 2019


В настоящее время я пытаюсь транслировать специально созданную сетку в three.js. Хотя для некоторых импортированных сеток лучевое вещание работает как прелесть, с моей пользовательской сеткой оно, похоже, совсем не работает.

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

Я использую следующую функцию для своей радиопередачи:

mouse.x = ((e.clientX - container.offsetLeft) / container.clientWidth) * 2 - 1;
mouse.y = -((e.clientY - container.offsetTop) / container.clientHeight) * 2 + 1;

rayCaster.setFromCamera(mouse, camera);
var intersect = rayCaster.intersectObjects(scene.getObjectByName('loaded_object').children, true); // working


mesh_1.geometry.computeFaceNormals();
mesh_1.updateMatrixWorld();
var intersect_custom = rayCaster.intersectObjects([mesh_1], true); // not working

Пока первое пересечение работает какОжидается, что мое собственное пересечение как-то не работает вообще - оно всегда возвращает пустой массив.
Правильно ли я полагаю, что проблема заключается в моей пользовательской сетке?

Итак, вот как я создал свой собственный меш:

material_k1.side = THREE.DoubleSide;
var singleGeometry_1 = new THREE.Geometry();
var mesh_1 = new THREE.Mesh(singleGeometry_1, material_k1);

meshes[i].updateMatrix();
singleGeometry_1.merge(meshes[i].geometry, meshes[i].matrix);

mesh_1.updateMatrix();
singleGeometry_1.verticesNeedUpdate = true;
singleGeometry_1.elementsNeedUpdate = true;
mesh_1 = new THREE.Mesh(singleGeometry_1, material_k1);



В чем еще может быть проблема? Мне действительно интересно, особенно потому, что кажется, что он не работает с моей собственной сеткой.

1 Ответ

0 голосов
/ 13 ноября 2019

Я только что нашел проблему сам после долгого пробования. Мой код был в порядке, за исключением одной строки, которая отсутствовала.

После добавления

mesh_1.geometry.computeBoundingSphere();

мой код работал как положено.

Похоже, что ограничивающая сфера также необходима для радиопередачи.
Спасибо за вашу помощь! Надеюсь, это поможет любому с той же проблемой.

...