ForgeViewerでの同一モデルの複数配置

Extensionなどのコードを読んでやりたいことの実現方法を調べた結果をまとめています。 どこまでが公式に保証されている動作かは把握できていないので、今後のバージョンで動く保証はできないです。

同一モデルの複数配置

同一モデルを位置を変えて複数配置したい場合は以下のようにすればできる。モデルの読み込みを一度だけにすることでメモリ消費を抑えることができそう(要確認)。

function loadModels(viewer: Autodesk.Viewing.GuiViewer3D, urn: string, offsets: Vector3[]) {
  return new Promise<Autodesk.Viewing.Model>((resolve, reject) => {
    Autodesk.Viewing.Document.load(
      urn,
      function onDocumentLoadSuccess(viewerDocument: Autodesk.Viewing.Document) {
        // viewerDocument is an instance of Autodesk.Viewing.Document
        console.log('Successed fetching Forge manifest');

        const rootNode = viewerDocument.getRoot();
        const defaultModel = rootNode.getDefaultGeometry();

        for (const offset of offsets) {
          viewer.loadDocumentNode(viewerDocument, defaultModel, {
            // preserveView: true,
            keepCurrentModels: true,
            //placementTransform: (new THREE.Matrix4()).setPosition(xform),
            globalOffset: offset,
          }).then(model => {
            resolve(model);
          });
        }
      },
      function onDocumentLoadFailure() {
        console.error('Failed fetching Forge manifest');
        reject();
      }
    );
  });
}

loadDocumenntNodeのオプションにkeepCurrentModelsを設定しておくことで、複数モデルを読み込むことができました。 試せていませんが、placementTransformを指定することで、回転やスケールなども設定できそうです。