像双击事件一样放大对象

问题描述

我试图在查看器中创建一个功能放大对象,例如双击事件。我发现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都有自己的边界框,我如何确定整个对象的边界框。 预先感谢。

解决方法

实现对象缩放

您绝对可以使用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;
}