【问题标题】:Zoom into object like double click event像双击事件一样放大对象
【发布时间】:2020-12-09 12:30:29
【问题描述】:

我尝试在查看器中创建一个放大对象的功能,例如双击事件。我发现fitToView 方法确保在查看器中选择但不放大。按照这里的答案: Autodesk forge viewer zooming to bounding box 我需要找到对象的边界框,我会得到我需要的。我根据这篇文章来确定对象边界框https://forge.autodesk.com/blog/working-2d-and-3d-scenes-and-geometry-forge-viewer。 我有一些问题:为什么 1 个对象有很多 fragId 并且每个 fragId 都有自己的边界框,我如何确定整个对象的边界框。 提前致谢。

【问题讨论】:

    标签: autodesk-viewer


    【解决方案1】:

    实现缩放到对象

    您绝对可以使用fitToView 方法来实现与在 Forge Viewer 中双击对象时相同的“缩放到对象”功能。请记住,该方法的第一个参数必须是一个数组。因此,例如,如果您想放大 dbID 为 1234 的对象,则方法调用将是 viewer.fitToView([1234]);

    为什么对象和片段之间存在一对多的映射关系?

    Forge Viewer 中的单个可选对象(例如,一扇门)通常可以由具有不同材料的多个部分组成(例如,一个木框架和一个金属门把手)。然后将这些部分表示为单独的片段,每个片段指定自己的几何、材质、变换和边界框。

    计算多个边界框的并集​​

    Forge Viewer 中的边界框通常使用THREE.Box3 类表示,该类提供了几个帮助方法,包括。 union。此方法可用于扩展现有边界框,使其“包含”另一个边界框。

    以下是计算特定对象所有片段的边界框的方法:

    function computeObjectBounds(model, dbid) {
      const frags = model.getFragmentList();
      const tree = model.getInstanceTree();
      let objectBounds = new THREE.Box3();
      let fragBounds = new THREE.Box3();
      tree.enumNodeFragments(dbid, function (fragid) {
        frags.getWorldBounds(fragid, fragBounds);
        objectBounds.union(fragBounds);
      });
      return objectBounds;
    }
    

    【讨论】:

    • 非常感谢。你这么清楚地解释了一切,真是太好了。你确实帮了我很多。保持你的工作,我的朋友。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多