У меня очень простой сценарий в «Три». js, где пользователь может перемещать камеру, чтобы иметь вид от первого лица.
Камера не должна двигаться внутри объекта, например, куб. Я пытаюсь предотвратить это с помощью Raycaster.intersectObjects
. Однако, когда я вхожу, узнается только одно лицо куба. Кажется, что другие грани куба не "видимы" для луча, но, конечно, они отлично отображаются.
Соответствующий код выглядит так:
cubeGeometry = new THREE.CubeGeometry(size, size, size, 20, 20, 20);
cubeMesh = new THREE.Mesh(cubeGeometry, new THREE.MeshBasicMaterial({color: 0x00FF00, wireframe: true, side: THREE.DoubleSide}));
geometries.push(cubeMesh);
...
var oldCamera;
function moveAround(){
oldCamera = camera.clone();
if(movement=="forward") camera.translateZ(-30);
if(movement=="left") camera.translateX(-30);
if(movement=="backward") camera.translateZ(30);
if(movement=="right") camera.translateX(30);
ray = new THREE.Raycaster(camera.position, oldCamera.position.normalize());
ray.far = 100;
if(ray.intersectObjects(geometries).length>0){
// only the case with one of the faces of a cube
...
[РЕДАКТИРОВАНИЕ 2020.05.09]
Я загрузил рабочий пример на GitHub:
https://github.com/TovAqulic/threejs_collision_issue/blob/master/index.html
Вы можете перемещаться ( камера, то есть вы сами) с помощью клавиш со стрелками и можете поворачиваться с помощью мыши.
Все геометрические объекты, то есть окружающие стены и блок в середине, являются частью массива geometries
, который проверяется с помощью raycaster.intersectObjects(geometries)
.
Почти во всех случаях движение блокируется при движении на стену, фронтальным, обратным или боковым движением, как и ожидалось.
Однако, есть Есть места, где вы можете перемещаться через стены, особенно стены справа. Например, просто перейдите к правой стене сразу после загрузки страницы.
Я не понимаю, что я делаю неправильно.