Autodesk 平台服务中的动画 | Autodesk Forge
我正在尝试在 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
}
}
这篇博文是 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 毫秒的间隔开始向上移动。