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

如何判断指定dbid的对象在任意时刻是否被相机可见?

判断指定dbid对象是否在相机可见范围内的可行方法

以下是几种实用的实现思路,适用于常见的BIM/3D模型查看场景:

  • 视锥体包围盒相交检测
    获取指定dbid对象的包围盒,再与相机的视锥体做相交判断。以Autodesk Forge Viewer为例:

    const bbox = viewer.model.getBoundingBox(dbid);
    const isInFrustum = viewer.getCamera().frustum.intersectsBox(bbox);
    

    这个方法能快速判断对象是否处于相机视野范围内,但无法排除被其他对象遮挡的情况。

  • 结合射线检测的遮挡验证
    针对视锥体检测通过的对象,进一步做遮挡判断:从相机位置向对象包围盒的多个关键顶点(如8个角点)发射射线,若存在至少一条射线未被其他对象阻挡且命中目标对象,则说明该对象可见。示例代码逻辑:

    const bbox = viewer.model.getBoundingBox(dbid);
    const corners = [
      new THREE.Vector3(bbox.min.x, bbox.min.y, bbox.min.z),
      new THREE.Vector3(bbox.max.x, bbox.max.y, bbox.max.z)
      // 可补充其他6个角点
    ];
    let isVisible = false;
    const cameraPos = viewer.getCamera().position;
    for (const corner of corners) {
      const ray = new THREE.Raycaster(cameraPos, corner.sub(cameraPos).normalize());
      const intersects = viewer.impl.rayIntersect(ray, false);
      if (intersects.length > 0 && intersects[0].dbId === dbid) {
        isVisible = true;
        break;
      }
    }
    
  • 利用查看器内置可见性接口
    部分3D查看器(如Forge Viewer)提供了直接查询对象可见性的API,会自动处理视锥体、遮挡、对象隐藏状态等逻辑:

    const isVisible = viewer.isNodeVisible(dbid);
    

    注意不同查看器版本的API可能略有差异,需对应官方文档确认参数和返回值逻辑。

内容的提问来源于stack exchange,提问作者3dbim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:03:10