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

Forge Viewer:高效添加同一几何图形的多个实例

高效加载同一几何图形的多实例方案

嘿,这个问题确实戳中了Viewer批量加载重复模型的痛点——重复下载几何不仅慢,还浪费带宽和内存。给你分享两个经过验证的高效方案:

方案一:复用已加载的Document与模型资源

核心思路是只调用一次loadDocument获取文档元数据,之后多次调用loadModel时复用这个Document,同时通过配置参数让Viewer自动复用已缓存的几何资源,避免重复下载。

代码示例

let sharedDocument;
const viewerContainer = document.getElementById('viewer');

// 初始化Viewer
Autodesk.Viewing.Initializer({ env: 'AutodeskProduction' }, () => {
  const viewer = new Autodesk.Viewing.GuiViewer3D(viewerContainer);
  viewer.start();

  // 仅加载一次共享文档(同一URL只需执行一次)
  Autodesk.Viewing.Document.load('你的模型URL', (doc) => {
    sharedDocument = doc;
    // 加载第一个实例:平移到(0,0,0)位置
    loadModelInstance(viewer, new THREE.Matrix4().makeTranslation(0, 0, 0));
    // 加载第二个实例:平移到(10,0,0)位置
    loadModelInstance(viewer, new THREE.Matrix4().makeTranslation(10, 0, 0));
    // 可以继续添加更多实例...
  }, (error) => {
    console.error('加载文档失败:', error);
  });
});

// 复用共享文档加载模型实例的工具函数
function loadModelInstance(viewer, placementTransform) {
  const viewables = sharedDocument.getRoot().getDefaultGeometry();
  viewer.loadModel(viewables, {
    placementTransform: placementTransform, // 设置实例的位置变换
    keepCurrentModels: true, // 保留现有模型,不替换场景中的内容
    loadOptions: {
      reuseExistingGeometry: true // 关键:告诉Viewer复用已加载的几何资源
    }
  });
}

方案二:手动克隆模型片段(更精细的控制)

如果需要对实例的几何、材质等做自定义修改,可以直接克隆已加载模型的Fragment(片段),手动设置变换后添加到场景中,完全复用原始模型的几何数据。

代码示例

let originalModel;
const viewerContainer = document.getElementById('viewer');

Autodesk.Viewing.Initializer({ env: 'AutodeskProduction' }, () => {
  const viewer = new Autodesk.Viewing.GuiViewer3D(viewerContainer);
  viewer.start();

  // 先加载一次原始模型(仅需一次)
  viewer.loadModel('你的模型URL', {}, (model) => {
    originalModel = model;
    // 克隆第一个实例
    cloneModelInstance(viewer, originalModel, new THREE.Matrix4().makeTranslation(0, 0, 0));
    // 克隆第二个实例
    cloneModelInstance(viewer, originalModel, new THREE.Matrix4().makeTranslation(5, 0, 0));
  });
});

// 克隆模型实例的工具函数
function cloneModelInstance(viewer, originalModel, transform) {
  // 克隆原始模型的结构与资源
  const clonedModel = viewer.impl.cloneModel(originalModel);
  // 设置克隆实例的变换矩阵
  const fragmentList = clonedModel.getFragmentList();
  clonedModel.fragments.forEach(fragId => {
    fragmentList.setTransform(fragId, transform);
  });
  // 将克隆实例添加到Viewer场景
  viewer.impl.addModel(clonedModel);
  // 通知Viewer更新场景
  viewer.impl.sceneUpdated(true);
}

注意事项

  • 确保使用的Viewer版本较新(建议v7及以上),新版本对资源复用的支持更完善。
  • 如果模型包含自定义材质或属性,克隆后可以单独修改克隆实例的材质,不会影响原始模型。
  • 两种方案都能避免重复下载几何,方案一更简洁,方案二更灵活,可根据你的业务需求选择。

内容的提问来源于stack exchange,提问作者Peter Harman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:04:12