场景中两个对象之间的三个 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 )。
这样一来,您就不需要为碰撞检测测试包括墙,因为它使用的是单独的位掩码。
我知道单击鼠标时场景中的光线投射对象,但现在我需要知道场景中的两个对象是否可以相互光线投射。
这是,我在场景中加载一个 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 )。
这样一来,您就不需要为碰撞检测测试包括墙,因为它使用的是单独的位掩码。