Javascript three.js上的摄影机和地形碰撞

Javascript three.js上的摄影机和地形碰撞,javascript,three.js,collision-detection,collision,collada,Javascript,Three.js,Collision Detection,Collision,Collada,我用sketchup创建了一个建筑模型,导出为collada文件,并用ColladLoader加载到three.js。 除了相机可以穿墙外,一切都很好。我如何防止这种情况?到目前为止,我已经试过了 Raycasting,但我觉得有点不对劲 这就是加载模型的方式 loader.options.convertUpAxis = true; loader.load( 'model/cityhall.dae', function ( collada ) { dae = collada.scene; sk

我用sketchup创建了一个建筑模型,导出为collada文件,并用ColladLoader加载到three.js。 除了相机可以穿墙外,一切都很好。我如何防止这种情况?到目前为止,我已经试过了 Raycasting,但我觉得有点不对劲

这就是加载模型的方式

loader.options.convertUpAxis = true;
loader.load( 'model/cityhall.dae', function ( collada ) {

dae = collada.scene;
skin = collada.skins[ 0 ];
model_geometry = collada.scene.children[ 0 ].children[0].geometry;
model_material = collada.scene.children[ 0 ].children[0].material;

dae.scale.x = dae.scale.y = dae.scale.z = 1;
dae.updateMatrix();
scene.add( dae );
dae.traverse(function (child) {
if (child instanceof THREE.Mesh) {
                        objects.push(child);
                    }
                });
            });
雷卡斯特

            rayFloor = new THREE.Raycaster();
            rayFloor.ray.direction.set( 0, -1, 0 );

            rayWall = new THREE.Raycaster();
            rayWall.ray.direction.set(0,0,1);
这是用于动画的

            function animate() {
            requestAnimationFrame( animate );

            controls.isOnObject( false );
                            controls.isWallCollision( false);

            rayFloor.ray.origin.copy( controls.getObject().position );
            rayFloor.ray.origin.x -= 10;

            rayWall.ray.origin.copy( controls.getObject().position );
            rayWall.ray.origin.y -= 8;

            var intersections = rayFloor.intersectObjects( objects );
            var intersections2 = rayWall.intersectObjects( objects );

            if ( intersections.length > 0 ) {
                //console.log('floor' + intersections);

                var distance = intersections[ 0 ].distance;
                if ( distance > 0 && distance < 10 ) {
                    controls.isOnObject( true );
                }

            }

            if ( intersections2.length > 0 ) {
                //console.log('wall' + intersections);

                var distance = intersections2[ 0 ].distance;
                if ( distance > 0 && distance < 10 ) {
                    controls.isWallCollision( true );
                }

            }
            controls.update( Date.now() - time );
            render();

            time = Date.now();
        }
function animate(){
请求动画帧(动画);
对照组。isOnObject(假);
控件。isWallCollision(false);
rayFloor.ray.origin.copy(controls.getObject().position);
rayFloor.ray.origin.x-=10;
rayWall.ray.origin.copy(controls.getObject().position);
rayWall.ray.origin.y-=8;
var交点=光线地板。相交对象(对象);
var intersections2=光线墙。intersectionobjects(对象);
如果(交点长度>0){
//控制台日志(“楼层”+交叉点);
var距离=交点[0]。距离;
如果(距离>0&&距离<10){
控件。isOnObject(true);
}
}
如果(相交2.length>0){
//控制台日志(“墙”+交叉点);
变量距离=相交2[0]。距离;
如果(距离>0&&距离<10){
控件。isWallCollision(true);
}
}
控件。更新(Date.now()-时间);
render();
时间=日期。现在();
}

问题是它无法正确检测墙壁和地板。

这里有一个链接,指向使用Raycaster进行碰撞检测的工作示例:


希望有帮助

这篇文章对@gaitat有什么帮助吗?我似乎无法让这篇文章对我有用。。。我已经更新了代码。以mrdoob为例,我还编辑了pointerlockcontrols.js以添加向前移动的停止,但问题是如何检测墙碰撞。下面是工作示例:我已经编辑并制作了墙碰撞。现在的挑战是有些墙不会“碰撞”。还有,上下楼梯。