cesium 屏幕坐标转笛卡尔坐标
时间: 2025-06-05 17:32:21 浏览: 11
### 在 Cesium 中将屏幕坐标转换为笛卡尔坐标
在 Cesium 中,屏幕坐标通常以二维形式表示(例如,相对于画布左上角的像素位置),而笛卡尔坐标则是三维空间中的点。为了实现从屏幕坐标到笛卡尔坐标的转换,可以使用 `Cesium.Scene` 提供的相关方法。
#### 使用 `scene.camera.getPickRay` 方法
`scene.camera.getPickRay` 方法可以根据屏幕坐标生成一条射线,该射线从摄像机指向屏幕上的指定位置[^4]。然后,通过与地球椭球体相交,可以计算出对应的笛卡尔坐标。
以下是具体实现代码:
```javascript
// 定义屏幕坐标 (x, y),单位为像素
const screenPosition = new Cesium.Cartesian2(100, 200);
// 获取场景中的射线
const ray = viewer.scene.camera.getPickRay(screenPosition);
// 计算射线与地球椭球体的交点
const cartesian = viewer.scene.globe.ellipsoid.intersectRay(ray);
if (Cesium.defined(cartesian)) {
console.log("转换后的笛卡尔坐标:", cartesian);
} else {
console.log("未找到交点");
}
```
#### 使用 `scene.pickPosition` 方法
另一种方式是使用 `Cesium.SceneTransforms.wgs84ToWindowCoordinates` 的逆操作,即 `scene.pickPosition` 方法。此方法直接返回屏幕坐标对应的笛卡尔坐标。
以下是具体实现代码:
```javascript
// 定义屏幕坐标 (x, y),单位为像素
const screenPosition = new Cesium.Cartesian2(100, 200);
// 启用 pick position 模式
viewer.scene.screenSpaceCameraController.enablePickPosition = true;
// 获取笛卡尔坐标
const cartesian = viewer.scene.pickPosition(screenPosition);
if (Cesium.defined(cartesian)) {
console.log("转换后的笛卡尔坐标:", cartesian);
} else {
console.log("未找到对应坐标");
}
```
#### 注意事项
- 屏幕坐标 `(x, y)` 的原点位于画布的左上角,水平方向为 X 轴,向右为正;垂直方向为 Y 轴,向下为正。
- 如果射线未与地球椭球体相交,则返回值为 `undefined`。
- `scene.pickPosition` 方法需要启用 `screenSpaceCameraController.enablePickPosition`,否则可能无法正常工作。
#### 示例完整代码
以下是一个完整的示例,展示如何从屏幕坐标转换为笛卡尔坐标:
```javascript
// 定义屏幕坐标 (x, y),单位为像素
const screenPosition = new Cesium.Cartesian2(100, 200);
// 方法一:使用 getPickRay 和 intersectRay
const ray = viewer.scene.camera.getPickRay(screenPosition);
const cartesian1 = viewer.scene.globe.ellipsoid.intersectRay(ray);
if (Cesium.defined(cartesian1)) {
console.log("方法一 - 转换后的笛卡尔坐标:", cartesian1);
} else {
console.log("方法一 - 未找到交点");
}
// 方法二:使用 pickPosition
viewer.scene.screenSpaceCameraController.enablePickPosition = true;
const cartesian2 = viewer.scene.pickPosition(screenPosition);
if (Cesium.defined(cartesian2)) {
console.log("方法二 - 转换后的笛卡尔坐标:", cartesian2);
} else {
console.log("方法二 - 未找到对应坐标");
}
```
阅读全文
相关推荐


















