Autodesk Forge Viewer v7.87:叠加模型Snapper功能因加载顺序失效
解决Autodesk Forge Viewer v7.87 Snapper加载顺序问题
当两个叠加模型加载顺序反转时,Snapper功能失效且hitTest仅返回后加载模型的问题,可通过以下方法修复:
1. 手动配置Snapper的目标模型
默认Snapper可能仅自动监听最后加载的模型,可在所有模型加载完成后,手动将两个模型都添加到Snapper的检测列表:
// 在所有模型加载完成后执行(例如绑定viewer的FINISH_LOADING_EVENT事件) viewer.addEventListener(Autodesk.Viewing.FINISH_LOADING_EVENT, () => { const snapper = viewer.toolController.getTool('Snapper'); if (!snapper) return; // 清空默认目标,重新添加所有已加载模型 snapper.clearTargets(); viewer.impl.modelQueue().getModels().forEach(model => { snapper.addModel(model); }); snapper.update(); });
2. 调整模型渲染优先级
模型的渲染层级可能影响hitTest的检测结果,手动设置不同优先级确保两个模型都能被正确命中:
// 加载完成后分别为两个模型设置优先级 model1.setPriority(1); model2.setPriority(2); // 强制刷新视图使设置生效 viewer.impl.invalidate(true);
3. 自定义Snapper的hitTest逻辑
重载默认的hitTest方法,遍历所有模型进行检测,避免仅返回单一模型的结果:
const snapper = viewer.toolController.getTool('Snapper'); if (snapper) { const originalHitTest = snapper.hitTest; snapper.hitTest = function(viewport, screenPoint, options) { const allHits = []; // 遍历所有已加载模型执行hitTest viewer.impl.modelQueue().getModels().forEach(model => { const hitResult = originalHitTest.call(this, viewport, screenPoint, { ...options, model }); if (hitResult) { allHits.push(hitResult); } }); // 返回距离最近的命中结果 return allHits.length ? allHits.sort((a, b) => a.distance - b.distance)[0] : null; }; }
4. 升级Viewer版本
v7.87属于较早版本,Autodesk后续版本可能已修复Snapper的加载顺序相关bug,建议升级到最新稳定版(如v7.x系列的最新版或v8.x),并参考官方Release Notes确认修复内容。
内容的提问来源于stack exchange,提问作者OneTuskedMario
相关产品推荐
相关产品推荐

