如何在Forge Autodesk Viewer中获取楼层节点的位置与旋转属性?
获取Forge Viewer中楼层节点的位置与旋转值
Hey there! 很高兴帮你解决这个问题——你说得没错,Forge Viewer里的楼层节点确实存储了本地坐标和旋转信息,我们可以通过Viewer的API轻松获取到这些数据。下面是具体的实现步骤:
1. 定位目标楼层的DbId
首先你需要把已知的节点编号对应到Viewer中的DbId(每个模型元素唯一的数字ID)。如果你的节点编号是模型属性里的字段(比如"楼层编号"),可以通过属性搜索来找到对应的DbId:
// 假设节点编号存储在属性"FloorNumber"中,值为"F3" viewer.search('F3', (dbIds) => { if (dbIds.length > 0) { const targetDbId = dbIds[0]; // 拿到DbId后继续下一步操作 getNodeTransform(targetDbId); } }, null, ['FloorNumber']);
如果已经直接知道目标节点的DbId,这一步可以跳过。
2. 获取节点的变换矩阵
Viewer中每个节点的位置、旋转和缩放信息都封装在一个4x4的变换矩阵里。我们可以通过instanceTree获取这个矩阵:
function getNodeTransform(dbId) { const model = viewer.model; const instanceTree = model.getData().instanceTree; const matrix = new THREE.Matrix4(); // 获取节点的本地变换矩阵(相对于父节点的坐标) instanceTree.getNodeTransform(dbId, matrix); // 从矩阵中提取位置和旋转 extractPositionAndRotation(matrix); }
3. 从矩阵中提取位置和旋转值
拿到变换矩阵后,我们可以用Three.js的方法分解出具体的位置和旋转:
function extractPositionAndRotation(matrix) { // 提取本地位置(三维坐标) const position = new THREE.Vector3(); matrix.decompose(position, new THREE.Quaternion(), new THREE.Vector3()); console.log('本地位置:', position.x, position.y, position.z); // 提取旋转信息(转换成欧拉角更直观) const quaternion = new THREE.Quaternion(); matrix.decompose(new THREE.Vector3(), quaternion, new THREE.Vector3()); const rotation = new THREE.Euler().setFromQuaternion(quaternion); // 转换为角度(默认是弧度) const rotationDeg = { x: THREE.MathUtils.radToDeg(rotation.x), y: THREE.MathUtils.radToDeg(rotation.y), z: THREE.MathUtils.radToDeg(rotation.z) }; console.log('本地旋转(角度):', rotationDeg); }
对于平面结构的楼层来说,通常旋转只会在Z轴(假设Y轴为建筑的垂直方向),所以你主要关注rotationDeg.z的值就可以了。
注意事项
- 确保在模型几何加载完成后再执行这些代码,可以通过监听
GEOMETRY_LOADED_EVENT事件来触发:viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, () => { // 模型加载完成,开始获取节点变换 // ... 这里调用上面的方法 }); - 如果你需要的是世界坐标(相对于Viewer全局坐标系),可以把本地矩阵和父节点的变换矩阵相乘,或者直接使用Viewer提供的坐标转换方法,但你提到的本地坐标直接用上面的方法就能拿到。
内容的提问来源于stack exchange,提问作者Fred Coud
相关产品推荐
相关产品推荐

