场景中两个对象之间的三个 js RayCast

Three js RayCast between two object in scene

我知道单击鼠标时场景中的光线投射对象,但现在我需要知道场景中的两个对象是否可以相互光线投射。

这是,我在场景中加载一个 3D 对象,例如 OBJ 对象中的两个房间,然后我在某些点添加三个网格框,例如第一个房间的两个点和第二个房间的一个点。

然后第一个房间的两个点可以互相投射(有直接视野),但是第一个房间的两个点不能投射到第二个房间的点。(他们没有穿过房间墙壁的视野)。

我附上了用于加载场景和点的代码,有什么建议要做吗?

//LOAD MAIN 3D OBJECT
    var objLoader = new THREE.OBJLoader();
        objLoader.setMaterials(materials);
        objLoader.setPath('./asset/3d/');
        objLoader.load("model01.obj", function(object){
            var mesh = object.children[0];
            mesh.castShadow = true;
            mesh.receiveShadow = true;

            mesh.rotation.x = Math.PI / 2;

            var box = new THREE.Box3().setFromObject( object )
            var ox = -(box.max.x + box.min.x) / 2;
            var oy = -(box.max.y + box.min.y) / 2;
            var oz = -(box.max.z + box.min.z) / 2;
            mesh.position.set(ox, oy, oz);

            _scene.add(mesh);

            render();

            setTimeout(render, 1000);

        }

//LOAD count_points inside scene
for(var i=0;i<cta_points;i++){
    var c_r = 2;
    var c_geometry = new THREE.BoxBufferGeometry( c_r, c_r, c_r );
    var c_material = new THREE.MeshLambertMaterial( { color: new THREE.Color("rgb("+(40 +   30)+", 0, 0)"),opacity: 0.0,
                        transparent: true} );                       
    var c_mesh = new THREE.Mesh( c_geometry, c_material );
    var position = get_positions(i);
    c_mesh.position.copy(position);                                                 
    c_mesh.name="BOX";
    scene.add( c_mesh );    
}

可能看看:

How to detect collision in three.js?

通常,为了解决这个问题,你会制作一个带有碰撞组的碰撞遮罩。

碰撞组是为每个对象添加的,由位掩码中的"bit"表示,

墙可以在单独的碰撞组中,例如 4(二进制 100)

并且对象可以在另一组中,比如 2(二进制 10)

然后你只需要检查对象与遮罩的碰撞。

(检查碰撞组是否匹配位掩码(上面的掩码可以是 10、100,)以检查碰撞)。

这样,您就可以调用 THREE.Raycaster().intersectObjects(args),其中参数是通过位掩码测试的参数 ( mask == object.collision_group )。

这样一来,您就不需要为碰撞检测测试包括墙,因为它使用的是单独的位掩码。