如何获取Scene Builder自定义模型位置 能否替换Autodesk.gltf模型dbId
问题1:自定义模型位置获取方案
getPlacementTransform() 方法用于获取Forge加载的整模型的全局偏移矩阵,不适用于自行插入的Three.js网格对象,你可以按如下方式获取正确坐标:
- 首先修正你当前的矩阵赋值错误:你当前直接将角度值传入Quaternion构造参数的写法不符合Three.js逻辑,会导致矩阵计算错误,修正后代码如下:
this.cubeSetup = { id: "AB0014", position: [4, -5, 2], rotation: [0, 135, 0], }; const { position, rotation } = this.cubeSetup // 角度转弧度,生成正确四元数 const quaternion = new THREE.Quaternion().setFromEuler( new THREE.Euler( THREE.MathUtils.degToRad(rotation[0]), THREE.MathUtils.degToRad(rotation[1]), THREE.MathUtils.degToRad(rotation[2]) ) ) this.cube1.matrix = new THREE.Matrix4().compose( new THREE.Vector3(...position), quaternion, new THREE.Vector3(1, 1, 1) ) // 禁止Three.js自动覆写自定义矩阵 this.cube1.matrixAutoUpdate = false
- 点击事件触发后直接分解网格的世界矩阵获取实际坐标:
const pos = new THREE.Vector3() const quat = new THREE.Quaternion() const scale = new THREE.Vector3() // 分解世界矩阵获取全局坐标 cube1.matrixWorld.decompose(pos, quat, scale) console.log('模型实际坐标:', pos.x, pos.y, pos.z)
问题2:自定义模型标识绑定方案
不能直接替换Forge Viewer内置的dbId,该字段是Viewer内部维护的唯一索引,强行修改会破坏内部逻辑。你可以通过如下两种方案实现自定义ID绑定:
- 方案一:维护dbId与自定义ID的映射表
在gltf模型加载完成、对象树生成后,遍历所有节点的dbId,和你的自定义API ID做映射绑定,点击时通过选中的dbId查表获取自定义ID即可,示例代码:
const customIdMap = {} // 监听gltf模型的对象树生成事件 viewer.addEventListener(Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, (e) => { const currentModel = e.model currentModel.getObjectTree((tree) => { // 遍历模型所有节点dbId tree.enumNodeChildren(tree.getRootId(), (dbId) => { // 可根据节点名称、属性匹配对应自定义ID,这里按实际业务逻辑实现即可 const nodeName = tree.getNodeName(dbId) customIdMap[dbId] = 对应自定义API ID }) }) }) // 点击事件中获取自定义ID viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (e) => { if (!e.selections?.length) return const selectedDbId = e.selections[0].dbIdArray[0] const targetCustomId = customIdMap[selectedDbId] // 后续根据targetCustomId拉取展示对应信息即可 })
- 方案二:直接给网格对象挂载自定义ID
加载完gltf模型后遍历所有内部网格,给每个网格的userData属性挂载自定义ID,点击时通过射线检测结果直接取网格的自定义ID即可,不依赖内置dbId。
内容的提问来源于stack exchange,提问作者surya kumara
相关产品推荐
相关产品推荐

