放大对象,如双击事件

Zoom into object like double click event

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

实施zoom-to-object

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

为什么对象和片段之间存在1-to-many映射?

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

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

Forge Viewer 中的边界框通常使用 THREE.Box3 class which provides several helper methods incl. 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;
}