Three.js — Обнаружение столкновений — Obj Wavefront

Я пытаюсь построить виртуальный тур внутри здания (все здание представляет собой модель obj), используя three.js. Все загружается нормально, и библиотека довольно проста. Моя самая важная проблема заключается в том, что я не могу реализовать обнаружение столкновений с камерой, я пытался использовать лучи, но не смог найти подходящий пример для моего случая.

Загрузка моей модели:

var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
    var newModel = event.content;
    newModel.traverse( function ( child ) {
        if ( child instanceof THREE.Mesh ) {
            child.castShadow = true;
            child.receiveShadow = true;
        }
    } );
    scene.add( newModel );
    objects.push( newModel );
    });
loader.load( 'model/model.obj', 'model/model.mtl' );

Создание камеры (не знаю, имеет ли это отношение к вопросу)

camera = new THREE.PerspectiveCamera(
    45,
    window.innerWidth / window.innerHeight,
    1,
    10000
);
camera.position.set( 0, 25, 0 );
camera.lookAt( 0, 0, 0 );

ПРИМЕЧАНИЕ. Камера перемещается внутри модели, я не хочу обнаруживать столкновение между двумя отдельными моделями obj, я хочу обнаруживать столкновение (и не позволять камере проходить сквозь стены) внутри одной модели.

Любая помощь будет оценена


person Mac    schedule 28.05.2013    source источник
comment
Вам нужно показать, что вы пробовали в соответствии с коллизией. Код, который вы показываете, не имеет отношения к проблеме.   -  person gaitat    schedule 28.05.2013


Ответы (1)


Просмотрите документацию для Raycaster в Three.js по адресу http://threejs.org/docs/58/#Reference/Core/Raycaster, вы можете создать луч, подобный Raycaster (начало, направление, близко, далеко). Возможно, для вас это выглядело бы примерно так

var ray = new THREE.Raycaster(camera.position, cameraForwardDirection, camera.position, collisionDistance);

Где cameraForwardDirection — это направление перед вашей камерой. Я думаю, вы можете получить это, выполнив что-то вроде:

var cameraForwardDirection = new THREE.Vector3(0,0,-1).applyMatrix4(camera.matrixWorld);

Это должно работать, потому что камера указывает в отрицательном направлении Z (отсюда 0,0,-1), и мы хотим применить ориентацию камеры к этому вектору. Это предполагает, что вы движетесь только вперед. Если вы хотите проверить столкновения в других направлениях, вы можете отбрасывать лучи в других направлениях.

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

После того, как вы бросите этот луч, вам нужно будет проверить пересечения. Вы можете использовать метод ray.intersectObject(object, recursive). Поскольку кажется, что у вас есть только одна модель, это может выглядеть примерно так:

var intersects = ray.intersectObject(newModel, true);
if(intersects.length>0){
 // stop the camera from moving farther into the wall
}
person maaachine    schedule 28.05.2013
comment
Выглядит многообещающе, я протестирую и сообщу вам. Большое спасибо за рекомендации, сначала кажется, что я должен обновить библиотеку three.js (я все еще на r55), и есть некоторые проблемы с лучами. - person Mac; 29.05.2013
comment
Обнаружение столкновений работало (с r58)!!! Большое спасибо! Всплывающие окна alert() появляются в нужное время, теперь мне нужно только остановить движение камеры. Думаю, мне нужно изменить движение js. - person Mac; 31.05.2013
comment
Хорошо, я решил проблему с движением, и все работает отлично (загрузка процессора высока, как и ожидалось). Большое спасибо. - person Mac; 03.06.2013