如何在Cesium中获取GLTF模型节点(如飞机轮子)的世界坐标?
在Cesium中获取GLTF模型节点的世界坐标
要获取GLTF模型中轮子节点的世界坐标,核心是结合节点的局部变换矩阵和模型的世界变换矩阵进行计算,具体实现如下:
关键逻辑
模型的modelMatrix负责将模型空间坐标转换为世界空间坐标,节点的matrix是节点在模型空间内的局部变换。将这两个矩阵相乘,就能得到节点的世界变换矩阵,从中提取平移分量就是节点的世界坐标。
代码实现
必须等待模型加载完成后再执行节点操作,否则getNode会返回无效结果:
// 等待模型加载就绪 cesium.primitiveFighter.readyPromise.then(model => { // 获取轮子节点 const wheelNode = model.getNode("wheel"); if (!wheelNode) { console.error("未找到名为wheel的节点"); return; } // 计算节点的世界变换矩阵:模型世界矩阵 × 节点局部矩阵 const nodeWorldMatrix = Cesium.Matrix4.multiply( model.modelMatrix, wheelNode.matrix, new Cesium.Matrix4() // 存储计算结果的空矩阵 ); // 从世界矩阵中提取节点的世界笛卡尔坐标 const worldPosition = Cesium.Matrix4.getTranslation( nodeWorldMatrix, new Cesium.Cartesian3() // 存储结果的空笛卡尔坐标 ); // 可选:将笛卡尔坐标转换为经纬度格式 const cartographic = Cesium.Cartographic.fromCartesian(worldPosition); const longitude = Cesium.Math.toDegrees(cartographic.longitude); const latitude = Cesium.Math.toDegrees(cartographic.latitude); const height = cartographic.height; console.log("轮子世界笛卡尔坐标:", worldPosition); console.log("轮子经纬度坐标:", `${longitude.toFixed(6)}, ${latitude.toFixed(6)}, ${height.toFixed(2)}`); });
注意事项
- 若你动态修改了
wheelNode.matrix,每次修改后都需要重新计算nodeWorldMatrix和worldPosition,才能获取最新的世界坐标。 - 不要直接通过网格顶点取坐标:网格顶点是模型空间下的原始数据,已经被节点矩阵和模型矩阵层层变换,直接读取无法得到正确的世界位置,必须通过矩阵组合计算。
内容的提问来源于stack exchange,提问作者alan alan
相关产品推荐
相关产品推荐

