Three.js-碰撞检测-Obj波前

Three.js-碰撞检测-Obj波前,three.js,webgl,collision-detection,wavefront,Three.js,Webgl,Collision Detection,Wavefront,我正在尝试使用three.js在建筑物内构建一个虚拟游览(整个建筑物是一个obj模型)。一切都很好,库也很简单。我最关键的问题是我不能用相机实现碰撞检测,我尝试使用光线,但我找不到适合我的例子 我的模型负载: var loader = new THREE.OBJMTLLoader(); loader.addEventListener( 'load', function ( event ) { var newModel = event.content; newModel.trave

我正在尝试使用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' );
相机创建(我不知道是否与问题相关)

注意:相机在模型内部移动,我不想检测两个单独的obj模型之间的碰撞,我想检测单个模型内部的碰撞(并阻止相机穿过墙壁)


如果您有任何帮助,我们将不胜感激。

请查看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);
var intersects = ray.intersectObject(newModel, true);
if(intersects.length>0){
 // stop the camera from moving farther into the wall
}
这应该是可行的,因为摄影机指向负Z方向(因此为0,0,-1),我们希望将摄影机的方向应用于此向量。这假设您只是在前进。如果要检查其他方向的碰撞,可以在其他方向投射光线

collisionDistance是碰撞的最小距离。您可以对此进行实验,以找到与场景中事物的比例相关的效果

投射此光线后,需要检查交点。可以使用ray.intersectObject(object,recursive)方法。因为看起来你只有一个模型,它可能看起来像:

var cameraForwardDirection = new THREE.Vector3(0,0,-1).applyMatrix4(camera.matrixWorld);
var intersects = ray.intersectObject(newModel, true);
if(intersects.length>0){
 // stop the camera from moving farther into the wall
}

您需要根据碰撞显示您尝试了什么。您显示的代码与问题无关。它看起来很有希望,我将测试它并让您知道。非常感谢您提供的指导原则,一开始我似乎应该更新three.js库(我仍然在r55),并且光线存在一些“问题”。碰撞检测工作正常(使用r58)!!!非常感谢你!alert()弹出窗口似乎出现在正确的时间,现在我只需要停止相机移动。我想我必须改变运动。好的,我解决了运动问题,它工作得很好(cpu负载如预期的那样高),非常感谢