Three.js-碰撞检测-Obj波前
我正在尝试使用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
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负载如预期的那样高),非常感谢