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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:43:16