当前位置: 首页 > 知识库问答 >
问题:

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

邢凯歌
2023-11-05

我的本意是想让整块部件往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建出来的模型应该如何获取他们的位置,为什么这个代码获取出来的部分位置是错误的

共有1个答案

祝灼光
2023-11-05

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

  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图形有一定的理解。你可能需要研究这些方面的知识,以便更好地理解和解决问题。

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

 类似资料:
  • eslint版本 9.9.0 vite版本 5.4.1 在vite中,配置了自动引入,但是eslint还是会报错ESLint: 'useState' is not defined.(no-undef),eslint应该怎么配置,求大佬告知 希望可以不用没有都写import { useState } from "react"这种引入

  • 正在尝试将SpringBoot与SpringData与Elasticache一起使用: application.properties: 缓存配置: } 服务电话: 错误: 组织。springframework。数据雷迪斯。ClusterRedirectException:重定向:插槽7228到10…:6379.* redis.clients.jedis.exceptions.JedisMovedD

  • 你好,我正在学习OOP,通过编写一个虚拟的库管理项目在Java。 在serachBook()中,如果在ArrayList中找到book,则返回book对象,如果未找到,则抛出自定义异常BookNotFound。 问题1:它应该只返回null并在调用代码时检查返回值是否为null,还是抛出自定义异常BookNotFound。 目前我认为BookNotFinder是合适的,并且目前正在这样做。然而,我

  • 问题描述 找到一个使用 Canvas + WebFont 绘制的报错页面,但是示例代码运行会报错。 相关代码 主页代码 css js 你期待的结果是什么?实际看到的错误信息又是什么? 可见控制台报错 求助大伙儿帮忙看看问题在哪,如何解决,顺便说一下问题的解决思路,谢谢

  • 本文向大家介绍JavaScript 异常处理 详解,包括了JavaScript 异常处理 详解的使用技巧和注意事项,需要的朋友参考一下   前端工程师都知道 JavaScript 有基本的异常处理能力。我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常。但估计绝大多数前端工程师都没考虑过收集这些异常信息 反正只要 JavaScript 出错后刷新不复现,那用