我知道单击鼠标时如何在场景中进行光线投射,但是现在我需要知道场景中的两个对象是否可以彼此进行光线投射。
这是,我在场景中加载了一个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 );
}
答案 0 :(得分:1)
可能看看:
How to detect collision in three.js?
通常,要解决此问题,您可以创建带有碰撞组的碰撞蒙版。
为每个对象添加了碰撞组,并通过位掩码中的“位”表示
墙壁可能在单独的碰撞组中,例如4(二进制100)
并且这些对象可能在另一个组中,例如2(二进制10)
然后,您只需要检查对象与蒙版的碰撞即可。
(检查冲突组是否与位掩码匹配(上面的掩码可以是10、100,以检查是否存在冲突)。
这样,您可以调用THREE.Raycaster()。intersectObjects(args),其中参数是通过位掩码测试的参数(mask == object.collision_group)。
那样,由于它使用了单独的位掩码,因此您无需包括用于碰撞检测测试的墙。