在cesium中加载了gltf模型,怎么在模型加载完或者点击模型某些节点(物品)的时候在物品上方显示一个信息窗?现在是获取不到物品的经纬度,控制台看了下点击的信息,节点里面没有关于位置的信息,比如position等
在cesium中加载了gltf模型,怎么在模型加载完或者点击模型某些节点(物品)的时候在物品上方显示一个信息窗?现在是获取不到物品的经纬度,控制台看了下点击的信息,节点里面没有关于位置的信息,比如position等
在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);
请注意,上面的代码只是一个起点,你需要根据你的具体需求完善它,特别是识别点击的节点和获取其本地坐标的部分。
8 回答5.8k 阅读✓ 已解决
9 回答9.2k 阅读
6 回答4.7k 阅读✓ 已解决
5 回答3.5k 阅读✓ 已解决
3 回答10.3k 阅读✓ 已解决
4 回答7.9k 阅读✓ 已解决
7 回答9.8k 阅读