开发者问题收集

Autodesk 平台服务中的动画 | Autodesk Forge

2023-02-23
296

我正在尝试在 autodesk forge 中创建动画。但每次我通过不同的方式创建它时,都会收到相同的错误。

问题是未找到 getFragmentProxy。因为我正在尝试实现以下教程:

https://aps.autodesk.com/blog/know-how-complex-component-transformations-viewer-part-1-basics

在互联网上搜索时,我发现一个人有同样的问题。下面我留下了答案的链接。

TypeScript Definitions for Forge Viewer missing getFragmentProxy

在这篇文章中,他给出了多个答案,但没有一个对我有用。读了一点,我发现这可能是因为 @types 问题,但即使我进行了 SDK 配置并设置了类型路径,我还是无法解决问题。

所以我的问题是。解决这个问题的最佳方法是什么,或者我可以按照什么教程在 autodesk forge 中制作动画,因为我认为许多动画已经停产了。非常感谢

我在下面附加了图片

在此处输入图片描述

{
  "compileOnSave": false,
  "compilerOptions": {
    "typeRoots": [
      "node_modules/@types"
    ],
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "module": "esnext",
    "moduleResolution": "node",
    "importHelpers": true,
    "target": "es2015",
    "lib": [
      "es2018",
      "dom"
    ],
    "types": [ "forge-viewer"],
    

  },
  "exclude": [
      "node_modules"
    ],
    
  "angularCompilerOptions": {
    "fullTemplateTypeCheck": true,
    "strictInjectionParameters": true
  }
}

1个回答

这篇博文是 2017 年的,但其中的代码应该仍能按预期工作。只需确保您没有“过早”尝试为片段添加动画即可。几何数据会随时间加载,对于复杂模型,可能需要一段时间,因此您应该等到所有几何图形都可用,例如,通过监听 Autodesk.Viewing.GEOMETRY_LOADED_EVENT

这是一个简化版本的实用函数,它将根据给定的增量移动特定对象:

function moveObject(viewer, model, dbId, dX, dY, dZ) {
    const tree = model.getInstanceTree();
    tree.enumNodeFragments(dbId, function (fragId) {
        const frag = viewer.impl.getFragmentProxy(model, fragId);
        frag.getAnimTransform();
        frag.position.x += dX;
        frag.position.y += dY;
        frag.position.z += dZ;
        frag.updateAnimTransform();
    }, true);
}

要进行测试,请转到 https://aps-simple-viewer-nodejs.autodesk.io/#dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6cGV0cmJyb3otc2FtcGxlcy9yYWNfYWR2YW5jZWRfc2FtcGxlX3Byb2plY3QucnZ0 ,然后尝试在控制台中粘贴以下代码:

NOP_VIEWER.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, function (ev) {
    function moveObject(viewer, model, dbId, dX, dY, dZ) {
        const tree = model.getInstanceTree();
        tree.enumNodeFragments(dbId, function (fragId) {
            const frag = viewer.impl.getFragmentProxy(model, fragId);
            frag.getAnimTransform();
            frag.position.x += dX;
            frag.position.y += dY;
            frag.position.z += dZ;
            frag.updateAnimTransform();
        }, true);
    }

    const viewer = ev.target;
    const model = ev.model;
    viewer.setProgressiveRendering(false); // Disable progressive rendering to avoid blinking during animation
    const dbids = viewer.getSelection();
    if (dbids.length === 1) {
        viewer.select([]);
        setInterval(function () {
            moveObject(viewer, model, dbids[0], 0, 0, 1.0);
            viewer.impl.invalidate(true, true);
        }, 100);
    }
});

现在,无论何时选择任何设计元素,它都会以 100 毫秒的间隔开始向上移动。

Petr Broz
2023-02-24