2

我正在尝试使用 three.js 在建筑物内(整个建筑物是一个 obj 模型)构建一个虚拟游览。一切都很好,图书馆非常简单。我最关键的问题是我无法用相机实现碰撞检测,我尝试使用光线但我找不到适合我的案例的示例。

我的模型负载:

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 模型之间的碰撞,我想检测一个模型内的碰撞(并阻止相机穿过墙壁)。

任何帮助将不胜感激

4

1 回答 1

1

在http://threejs.org/docs/58/#Reference/Core/Raycaster查看 Three.js 中 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),并且我们希望将相机的方向应用于该向量。这假设您只是在前进。如果您想检查其他方向的碰撞,您可以向其他方向投射光线。

碰撞距离将是碰撞的最小距离。您可以对此进行试验,以找出与场景中事物规模相关的方法。

一旦你投射了这条射线,你将需要检查交叉点。您可以使用 ray.intersectObject( object, recursive ) 方法。由于您似乎只有一个模型,它可能看起来像:

var intersects = ray.intersectObject(newModel, true);
if(intersects.length>0){
 // stop the camera from moving farther into the wall
}
于 2013-05-28T14:25:32.287 回答