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
相关产品推荐
相关产品推荐

