cesium如何获取模型里面节点的经纬度?

在cesium中加载了gltf模型,怎么在模型加载完或者点击模型某些节点(物品)的时候在物品上方显示一个信息窗?现在是获取不到物品的经纬度,控制台看了下点击的信息,节点里面没有关于位置的信息,比如position等

阅读 383
avatarAI BotBETA
在Cesium中,当你加载一个GLTF模型后,模型的节点位置是相对于模型的原点(通常是模型的中心点或者某个指定的根节点)的本地坐标。要获取这些节点在世界坐标系(即地球坐标系)中的经纬度,你需要将这些本地坐标转换为地理坐标(WGS84坐标系)。

### 获取模型节点的经纬度

1. **获取节点的本地坐标**:
   首先,你需要获取到节点的本地坐标(通常是`Cartesian3`格式)。这可以通过访问Cesium的`Model`实例中的`scene.primitives.get`方法(假设你已经以这种方式添加了模型)以及使用`model.nodeTransformations`或者通过遍历模型的节点树来找到特定的节点。

2. **将本地坐标转换为世界坐标**:
   使用Cesium的`Cesium.Transforms.eastNorthUpToFixedFrame`或者`Cesium.Transforms.worldToModelMatrix`和`Cesium.Matrix4.multiplyByPoint`等方法,你可以将节点的本地坐标转换为相对于地球的世界坐标。

3. **将世界坐标转换为经纬度**:
   使用`Cesium.Cartographic.fromCartesian`方法可以将世界坐标(Cartesian3)转换为地理坐标(Cartographic),然后你可以从中提取出经度、纬度和高度。

### 显示信息窗

要在点击模型节点时显示信息窗,你可以使用Cesium的`Scene.pick`方法在鼠标点击位置获取被点击的对象,然后结合上述方法获取被点击节点的经纬度,最后使用Cesium的`HtmlMarkerCollection`或者`Entity`来在相应位置显示信息窗。

### 示例代码

下面是一个简化的示例代码片段,展示了如何获取节点的经纬度并在控制台上打印出来(注意,实际实现中需要根据你的具体模型和Cesium版本进行调整):

// 假设你的模型已经被加载到Cesium的scene中
const model = scene.primitives.get(yourModelId);

// 监听鼠标左键点击事件
scene.screenSpaceEventHandler.setInputAction(function(movement) {

const pickedObject = scene.pick(movement.position);
if (Cesium.defined(pickedObject) && pickedObject.id === yourModelId) {
    // 这里需要添加代码来识别点击的是哪个节点,并获取其本地坐标
    // 例如,通过遍历model.nodes或者检查pickedObject的其他属性
    const nodeLocalPosition = ...; // 获取节点的本地坐标

    // 将本地坐标转换为世界坐标(地球坐标系)
    const modelMatrix = model.modelMatrix;
    const worldPosition = Cesium.Matrix4.multiplyByPoint(modelMatrix, nodeLocalPosition, 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(`Longitude: ${longitude}, Latitude: ${latitude}, Height: ${height}`);

    // 在这里添加显示信息窗的代码
}

}, Cesium.ScreenSpaceEventType.LEFT_CLICK);


请注意,上面的代码只是一个起点,你需要根据你的具体需求完善它,特别是识别点击的节点和获取其本地坐标的部分。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏