Babylon.js关于遮挡检测的问题
1. API和参数
- 我使用的API是Mesh.isOccluded
- Mesh.occlusionType = BABYLON.AbstractMesh.OCCLUSION_TYPE_STRICT
- Mesh.occlusionQueryAlgorithmType = BABYLON.AbstractMesh.OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE
2. 场景
- 我创建了一个盒子,并在盒子的表面贴满了贴片

- 在实际测试时,我的盒子是不透明状态。
3. 问题
- 我对盒子表面的贴片进行了遮挡检测
- 在进行检测之前,多次使用Mesh.isOcclusionQueryInProgress来判断系统是否对该Mesh的遮挡进行了计算
- 然而,盒子在正常视角下最多只会裸露三个面,也就是说,我的贴片应该最多只有一半是可见的,然而,实际测试中发现,可见的贴片始终在半数以上,有的甚至全部可见
4. 相关代码
// 创建贴片 const plane = new BABYLON.MeshBuilder.CreateBox("p"+i+j, {width:1, height:1, depth:0.01}, scene); plane.occlusionQueryAlgorithmType = BABYLON.AbstractMesh.OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE; plane.occlusionType = BABYLON.AbstractMesh.OCCLUSION_TYPE_STRICT;// 判断系统是否对mesh的遮挡进行了计算 // 代码中patches是plane的数组 let ready_counter = 0; function ifOccludedDataReady(box){ let patches = box.patches; let if_ready = true; if(ready_counter<1){ for(let i=0;i<6;i++){ for(let j=0;j<patches[i].length;j++){ if_ready = if_ready && patches[i][j].isOcclusionQueryInProgress; patches[i][j].isOccluded; // weakup if(!if_ready){ return false; } } } ready_counter++; return false; } else{ ready_counter = 0; return true; } }
5. 结果
- 可以看到,虽然box只裸露了三个表面,但是,所有的plane都处于未被遮挡状态。



6. 或者我们有没有其他的方法来检测遮挡?