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

如何在Forge Viewer的房间元素内部添加房间名称文本?

Forge Viewer 房间内部显示名称实现方案

你可以通过以下两种成熟方案实现房间名称在对应元素内部的展示:

方案1:使用内置HtmlOverlay扩展(推荐,实现简单,文本清晰)

该方案基于Viewer官方提供的HTML覆盖层能力,标签会固定跟随3D坐标,且始终保持清晰不受3D场景渲染精度影响。

  • 第一步:加载HtmlOverlay扩展
let overlayExt
await viewer.loadExtension('Autodesk.HtmlOverlay').then(ext => {
  overlayExt = ext
})
  • 第二步:遍历所有房间元素,逐个生成标签
// 假设roomDbIds是你提前获取的所有房间元素的dbId列表
roomDbIds.forEach(async dbId => {
  // 1. 读取房间名称属性
  const roomProps = await new Promise(resolve => viewer.getProperties(dbId, resolve))
  const roomName = roomProps.properties.find(item => item.displayName === '房间名称')?.displayValue
  if (!roomName) return

  // 2. 计算房间几何中心点坐标
  const renderProxy = viewer.impl.getRenderProxy(viewer.model, dbId)
  const bbox = new THREE.Box3().setFromObject(renderProxy)
  const roomCenter = bbox.getCenter(new THREE.Vector3())

  // 3. 创建标签DOM
  const label = document.createElement('div')
  label.style.cssText = `
    background: rgba(255,255,255,0.8);
    padding: 4px 8px;
    border-radius: 4px;
    font-size: 14px;
    color: #333;
    pointer-events: none;
  `
  label.textContent = roomName

  // 4. 添加到覆盖层
  overlayExt.addHtml(`room-label-${dbId}`, label, roomCenter)
})

方案2:使用Three.js Sprite(适合需要文本随场景缩放、支持遮挡的场景)

该方案生成的文本属于3D场景的一部分,会随视角远近缩放,也会被前方的构件遮挡。

  • 生成Sprite标签代码示例:
roomDbIds.forEach(async dbId => {
  // 读取房间名称、计算中心点的逻辑和方案1一致
  const roomName = 'xxx' // 替换为实际读取到的房间名
  const roomCenter = new THREE.Vector3() // 替换为实际计算的中心点

  // 用Canvas生成文本纹理
  const canvas = document.createElement('canvas')
  const ctx = canvas.getContext('2d')
  canvas.width = 256
  canvas.height = 64
  ctx.font = 'bold 32px Arial'
  ctx.fillStyle = '#000000'
  ctx.textAlign = 'center'
  ctx.fillText(roomName, 128, 40)
  
  const texture = new THREE.CanvasTexture(canvas)
  const sprite = new THREE.Sprite(new THREE.SpriteMaterial({
    map: texture,
    transparent: true
  }))
  sprite.position.copy(roomCenter)
  sprite.scale.set(6, 1.5, 1) // 根据实际房间大小调整缩放参数

  // 添加到场景
  viewer.impl.scene.add(sprite)
  viewer.impl.invalidate(true, true, true)
})

效果参考

Forge Viewer中的房间元素

注意事项

  • 可以监听Viewer的cameraChanged事件,动态隐藏不在当前视野内、或者被遮挡的标签,避免界面杂乱
  • 若模型包含多个楼层,可配合楼层过滤功能,只显示当前激活楼层的房间标签
  • 若部分异形房间的中心点不在房间内部,可通过射线检测调整标签位置,确保落在房间区域内

内容的提问来源于stack exchange,提问作者Than Naing Oo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 07:36:00