Q1:There was an error when using the raycaster to determine whether the target was blocked.
Expect:Verify that the occlusion logic is correct
Explain:
code:
function checkTargetIsVisiable(targetModel, visibleModel) {
if (!targetModel || !visibleModel || !raycaster) {
return false;
}
const targetMeshlist = getMeshesUsingTraverse(targetModel);
const visibleMeshlist = getMeshesUsingTraverse(visibleModel);
if (targetMeshlist.length === 0 || visibleMeshlist.length === 0) {
return false;
}
const targetBBox = new THREE.Box3().expandByObject(targetModel);
const targetCenter = targetBBox.getCenter(new THREE.Vector3());
//const lookat = controls.target;
const lookat = targetCenter.clone();
const direction = lookat.clone().sub(camera.position);
if (direction.lengthSq() < 0.0001) {
return true;
}
direction.normalize();
raycaster.set(camera.position, direction);
try {
const intersects = raycaster.intersectObjects(
visibleMeshlist.filter(obj => obj instanceof THREE.Object3D),
true
);
let firstIntersectsMesh = null;
for (let i = 0; i < intersects.length; i++) {
const intersect = intersects[i];
if (intersect.object && intersect.object.isMesh) {
firstIntersectsMesh = intersect.object;
break;
}
}
if (!firstIntersectsMesh) {
return false;
}
const isTargetVisible = targetMeshlist.some(mesh => mesh === firstIntersectsMesh);
console.log(isTargetVisible ? 'visible' : 'invisible');
return isTargetVisible;
} catch(error){
return false;
}
}
