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

时间:2018-07-20 22:46:16

标签: three.js raycasting

我知道单击鼠标时如何在场景中进行光线投射,但是现在我需要知道场景中的两个对象是否可以彼此进行光线投射。

这是,我在场景中加载了一个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 );    
}

1 个答案:

答案 0 :(得分:1)

可能看看:

How to detect collision in three.js?

通常,要解决此问题,您可以创建带有碰撞组的碰撞蒙版。

为每个对象添加了碰撞组,并通过位掩码中的“位”表示

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

并且这些对象可能在另一个组中,例如2(二进制10)

然后,您只需要检查对象与蒙版的碰撞即可。

(检查冲突组是否与位掩码匹配(上面的掩码可以是10、100,以检查是否存在冲突)。

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

那样,由于它使用了单独的位掩码,因此您无需包括用于碰撞检测测试的墙。