You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,运算效率更高):

  1. 提取授权房间的BufferGeometry数据(从模型中获取对应房间构件的几何体)
  2. 创建覆盖整个建筑的基础遮罩几何体
  3. 通过差集运算,将基础遮罩减去授权房间区域,得到仅覆盖非授权区域的遮罩
  4. 将遮罩添加到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:16:15