forge viewer部件异常移动应该如何解决?

我的本意是想让整块部件往x轴方向移动,但是当我获取他们的位置的时候,部分部件就会偏移原来的位置,移动到异常的地方
以下是我的部分代码:
这个是初始化代码

/* 连接入口 */
// 设置模型交互的方法
const setupModelInteraction = () => {
    tree = viewer.model.getData().instanceTree;
    const partNamesList = {
        basePart: ["T1"],
        Part: ["X1", "X2", "X3", "X5", "X6", "X12", "X13", "Z1", "Z2"]
    }
    const nodeIds = getModelNodeIds(partNamesList);

    baseRodPivot = createPivot(nodeIds.T1NodeId);
    // 获取除basePart外的所有部件名称
    const nonBasePartNames = Object.keys(partNamesList)
        .filter(key => key !== 'basePart') // 排除基础部件
        .flatMap(key => partNamesList[key]); // 展平名称数组

    // 为每个非基础部件创建辅助对象
    const helperObjects = nonBasePartNames.map(name => createHelper(nodeIds[`${name}NodeId`], baseRodPivot.position));
    //添加非基础件部件
    addHelpersToPivot(baseRodPivot, helperObjects);
    initializeRotation(helperObjects, nodeIds);
};
/* 运动入口 */
// 初始化旋转的方法,接收辅助对象和节点ID对象作为参数
const initializeRotation = (helperObjects, nodeIds) => {
    const partSuffixes = {
        linePart: {
            x: ["X1", "X2", "X3", "X5", "X6", "X12", "X13"],
            z: ["Z1", "Z2"]
        },
    };
    // 获取辅助对象和节点ID的对应关系
    const helperNodeIdPairs = getHelperNodeIdPairs(partSuffixes, helperObjects, nodeIds);
    console.log(helperNodeIdPairs)
    startRotationAnimation(helperNodeIdPairs);
};

上下文:(就是在applyHelpersTransformations这个函数之后就会出现问题)

// 应用辅助对象变换的方法,接收辅助对象和节点ID对象作为参数
const applyHelpersTransformations = (helperNodeIdPairs) => {
    for (const pair of helperNodeIdPairs) {
        assignTransformations(pair.helper, pair.id);
    }
};

// 动画辅助对象的方法,接收一个包含基准点、辅助对象、X轴偏移量、Z轴偏移量的对象作为参数
const animateHelpers = ({ helperNodeIdPairs, xOffsetAmount, zOffsetAmount }) => {
    const render = () => {
        const positions = calculateHelpersNewPositions(helperNodeIdPairs, xOffsetAmount, zOffsetAmount);
        updateHelpersPositions(helperNodeIdPairs, positions);
        applyHelpersTransformations(helperNodeIdPairs);

        viewer.impl.sceneUpdated(true);
        requestAnimationFrame(render);
    };

    render();
};

核心代码:

// 辅助函数
const assignTransformations = (refererence_dummy, nodeId) => {
    refererence_dummy.parent.updateMatrixWorld();
    const position = new THREE.Vector3();
    const rotation = new THREE.Quaternion();
    const scale = new THREE.Vector3();
    refererence_dummy.matrixWorld.decompose(position, rotation, scale);

    tree.enumNodeFragments(nodeId, (frag) => {
        const fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
        fragProxy.getAnimTransform();
        fragProxy.position = position;
        fragProxy.quaternion = rotation;
        fragProxy.updateAnimTransform();
    });
}

const findNodeIdbyName = (name) => {
    let nodeList = Object.values(tree.nodeAccess.dbIdToIndex);
    for (let i = 1, len = nodeList.length; i < len; ++i) {
        let node_name = tree.getNodeName(nodeList[i]);
        if (node_name === name) {
            return nodeList[i];
        }
    }
    return null;
}

const getFragmentWorldMatrixByNodeId = (nodeId) => {
    let result = {
        fragId: [],
        matrix: [],
    };
    tree.enumNodeFragments(nodeId, (frag) => {
        let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
        let matrix = new THREE.Matrix4();

        fragProxy.getWorldMatrix(matrix);

        result.fragId.push(frag);
        result.matrix.push(matrix);
    });
    return result;
}

我想要知道fusion360建出来的模型应该如何获取他们的位置,为什么这个代码获取出来的部分位置是错误的

阅读 635
avatarAI BotBETA

首先,要解决这个问题,我们需要明确几个关键点:

  1. 你使用的是哪种编程语言和库?这里似乎是JavaScript和Three.js库。
  2. 你提到的"forge viewer"是指哪种具体的产品或库?是否是Autodesk Forge Viewer?
  3. 你的代码中涉及到一些辅助函数(例如assignTransformationsfindNodeIdbyNamegetFragmentWorldMatrixByNodeId),这些函数是否是你自己编写的,还是来自某个特定的库或框架?

对于你的问题,"forge viewer部件异常移动应该如何解决",根据你提供的代码,我注意到了一些可能的问题:

  1. 初始化的位置问题:你的代码中初始化部件的位置可能不正确。你通过refererence_dummy.matrixWorld.decompose(position, rotation, scale)获取的位置信息可能不准确。如果refererence_dummy的初始位置不是预期的位置,那么你需要检查它是如何被设置和移动的。
  2. 更新模型数据:在viewer.impl.sceneUpdated(true)之后,你可能需要重新获取模型数据,以确保获取的位置信息是最新的。
  3. 动画循环的一致性:你在animateHelpers函数中使用了requestAnimationFrame(render)来创建一个动画循环。你需要确保这个循环在每个帧的更新中都能一致地运行,并且每次循环都能获取到最新的模型数据。
  4. 对于模型数据的理解和处理:你提到"部分部件就会偏移原来的位置",这部分可能是因为你的模型数据结构或者数据处理方式存在问题。你需要确保你正确地理解和处理了模型数据。

对于获取位置信息错误的问题,你可能需要更深入地了解你的模型数据和Forge Viewer的工作方式。Forge Viewer是基于WebGL的3D渲染器,它使用Three.js作为其底层的3D引擎。Three.js的场景管理、物体变换和渲染流程都需要对3D图形有一定的理解。你可能需要研究这些方面的知识,以便更好地理解和解决问题。

我建议你可以先从以上几点进行检查,或者你可以提供更多的上下文和错误信息,以便我可以为你提供更具体的建议。

1 个回答

用 fragProxy.setMatrix 方法,不是直接设置 position 和 quaternion


tree.enumNodeFragments(nodeId, (fragId) => {
    let fragProxy = viewer.impl.getFragmentProxy(viewer.model, fragId);
    let newMatrix = new THREE.Matrix4();

    // 计算新的变换矩阵
    // 这里你可以添加对newMatrix的操作,如平移、旋转等

    // 应用新的变换矩阵
    fragProxy.setMatrix(newMatrix.toArray());
    fragProxy.updateAnimTransform();
});

用 THREE.Matrix4 的 makeTranslation 方法来建一个平移矩阵:


let moveMatrix = new THREE.Matrix4();
moveMatrix.makeTranslation(xOffsetAmount, 0, 0);
newMatrix.multiplyMatrices(fragProxy.matrixWorld, moveMatrix);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题