我的本意是想让整块部件往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建出来的模型应该如何获取他们的位置,为什么这个代码获取出来的部分位置是错误的
首先,要解决这个问题,我们需要明确几个关键点:
assignTransformations
、findNodeIdbyName
、getFragmentWorldMatrixByNodeId
),这些函数是否是你自己编写的,还是来自某个特定的库或框架?对于你的问题,"forge viewer部件异常移动应该如何解决",根据你提供的代码,我注意到了一些可能的问题:
refererence_dummy.matrixWorld.decompose(position, rotation, scale)
获取的位置信息可能不准确。如果refererence_dummy
的初始位置不是预期的位置,那么你需要检查它是如何被设置和移动的。viewer.impl.sceneUpdated(true)
之后,你可能需要重新获取模型数据,以确保获取的位置信息是最新的。animateHelpers
函数中使用了requestAnimationFrame(render)
来创建一个动画循环。你需要确保这个循环在每个帧的更新中都能一致地运行,并且每次循环都能获取到最新的模型数据。对于获取位置信息错误的问题,你可能需要更深入地了解你的模型数据和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 出错后刷新不复现,那用