如何在APS Viewer中隐藏非授权房间?建筑数字孪生权限管控
Forge Viewer 实现租赁区域权限控制(隐藏非授权房间及内容)
方案一:基于构件属性的精准显隐控制
这是最直接的实现方式,前提是你的BIM模型中每个房间及其内部构件都标记了明确的属性(比如房间ID、租户归属):
- 遍历Viewer中的所有构件,通过
viewer.model.getProperties(dbId)获取构件属性 - 对比用户授权的房间列表,对非授权房间的所有构件执行
viewer.hide(dbId),授权房间构件执行viewer.show(dbId) - 注意处理嵌套构件,确保房间内部的家具、设备等子构件同步隐藏/显示
代码示例:
// 模拟用户授权的房间ID列表 const allowedRoomIds = ['ROOM_1']; // 遍历模型所有节点 viewer.model.getObjectTree(tree => { tree.enumNodeChildren(tree.rootId, dbId => { viewer.model.getProperties(dbId, props => { // 从构件属性中提取房间ID(需根据你的模型属性字段调整) const roomId = props.properties.find(p => p.displayName === 'roomId')?.displayValue; if (roomId) { allowedRoomIds.includes(roomId) ? viewer.show(dbId) : viewer.hide(dbId); } }); }); });
方案二:自定义遮罩层(适配非矩形房间)
如果单纯显隐构件无法满足视觉隔离需求(比如房间边界复杂),可以用遮罩层覆盖非授权区域。替代不兼容BufferGeometry的ThreeCSG,推荐使用three-bvh-csg(支持BufferGeometry,运算效率更高):
- 提取授权房间的BufferGeometry数据(从模型中获取对应房间构件的几何体)
- 创建覆盖整个建筑的基础遮罩几何体
- 通过差集运算,将基础遮罩减去授权房间区域,得到仅覆盖非授权区域的遮罩
- 将遮罩添加到Viewer场景,设置半透明材质实现视觉隐藏
代码示例:
import { SUBTRACTION, Brush, Evaluator } from 'three-bvh-csg'; // 获取建筑整体包围盒,生成基础遮罩几何体 const buildingBBox = viewer.model.getBoundingBox(); const buildingGeo = new THREE.BoxGeometry( buildingBBox.max.x - buildingBBox.min.x, buildingBBox.max.y - buildingBBox.min.y, buildingBBox.max.z - buildingBBox.min.z ).translate( (buildingBBox.max.x + buildingBBox.min.x) / 2, (buildingBBox.max.y + buildingBBox.min.y) / 2, (buildingBBox.max.z + buildingBBox.min.z) / 2 ); const buildingBrush = new Brush(buildingGeo); // 假设已从模型中提取到授权房间的BufferGeometry const roomBrush = new Brush(authorizedRoomGeometry); // 执行差集运算:基础遮罩 - 授权房间区域 = 非授权区域遮罩 const evaluator = new Evaluator(); const maskBrush = evaluator.evaluate(buildingBrush, roomBrush, SUBTRACTION); // 创建遮罩材质 const maskMaterial = new THREE.MeshBasicMaterial({ color: 0x000000, opacity: 0.7, transparent: true, depthWrite: false // 避免干扰模型深度测试 }); const maskMesh = new THREE.Mesh(maskBrush.geometry, maskMaterial); maskMesh.renderOrder = 100; // 确保遮罩在模型上方渲染 // 添加到Viewer场景 viewer.impl.scene.add(maskMesh);
注意事项
- 模型属性标记:提前在BIM软件中给房间及内部构件添加统一的属性字段(如roomId),是方案一的核心前提
- 性能优化:大模型下避免一次性遍历所有构件,可分批次处理;遮罩几何体尽量简化面数,减少运算压力
three-bvh-csg:需自行安装依赖,它是目前Three.js生态中支持BufferGeometry的主流CSG库,完全替代旧版ThreeCSG
内容的提问来源于stack exchange,提问作者Achim Stuy
相关产品推荐
相关产品推荐

