Три. js: обнаружение столкновения камеры от первого лица - PullRequest
1 голос
/ 01 мая 2020

У меня очень простой сценарий в «Три». 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).

Почти во всех случаях движение блокируется при движении на стену, фронтальным, обратным или боковым движением, как и ожидалось.

Однако, есть Есть места, где вы можете перемещаться через стены, особенно стены справа. Например, просто перейдите к правой стене сразу после загрузки страницы.

Я не понимаю, что я делаю неправильно.

1 Ответ

0 голосов
/ 02 мая 2020

ray = new THREE.Raycaster (camera.position, oldCamera.position.normalize ());

Этот код не идеален. Создайте свой экземпляр THREE.Raycaster один раз, а затем используйте его повторно. Также назовите его raycaster (так как это не экземпляр THREE.Ray). Кроме того, перед вызовом intersectObjects() используйте этот код для подготовки raycaster:

raycaster.ray.origin.copy( camera.position );
camera.getWorldDirection( raycaster.ray.direction );
...