关于Cesium中的常用坐标系及说明

本文详细介绍了Cesium中常用坐标系之间的转换方法,包括WGS84坐标系与笛卡尔空间直角坐标系之间的转换,以及平面坐标系、笛卡尔空间直角坐标系和Cartographic之间的相互转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Cesium是一个基于JavaScript的开源框架,可用于在浏览器中绘制3D的地球,并在其上绘制地图(支持多种格式的瓦片服务),该框架不需要任何插件支持,但是浏览器必须支持WebGL。

       Cesium中常用的坐标系主要有两种:WGS84坐标系和笛卡尔空间直角坐标系。平时我们常见的某个点的经纬度就是在WGS84坐标系下某个点的坐标,它的坐标原点在椭球的质心;而笛卡尔坐标系主要是用来做空间位置的变化如平移、旋转和缩放等等,它的坐标原点在椭球的中心。

除此之外,还有不常用的坐标系:1、平面坐标系(Cartesian2);2、笛卡尔空间直角坐标系(Cartesian3);3、Cartesian4(unknown,在应用中几乎用不到)4、Cartographic(地理坐标系下经纬度的弧度表示),通常情况下通过它和WGS84坐标系之间互转。


下边主要介绍  “平面坐标系” 和“笛卡尔空间直角坐标系”和“Cartographic”之间的相互转换关系

1:Cartesian2-----new Cesium.Cartesian2(xy)

I: Cartesian3→ Cartesian2Cesium.Cartesian2.fromCartesian3(cartesian, result)→ Cartesian2


2:Cartesian3---- new Cesium.Cartesian3(xyz)

I:经纬度坐标(WGS84)→ Cartesian3

Cesium.Cartesian3.fromDegrees(longitude, latitude, heightellipsoidresult) → Cartesian3
II:弧度坐标→ Cartesian3

Cesium.Cartesian3.fromRadians(longitude, latitude, heightellipsoidresult) → Cartesian3


3:Cartographic----new Cesium.Cartographic(longitudelatitudeheight)    注:经纬度为弧度单位

I:Cartesian3→ Cartographic

Cesium.Cartographic.fromCartesian(cartesian, ellipsoidresult) → Cartographic

II:经纬度坐标(WGS84)→ Cartographic

Cesium.Cartographic.fromDegrees(longitude, latitude, heightresult) → Cartographic


另外,经纬度坐标和弧度坐标也可以通过Cesium.Math来转换

Cesium.CesiumMath.toDegrees(radians) → Number

Cesium.CesiumMath.toRadians(degrees) → Number


举例:

I:经纬度坐标转为笛卡尔空间直角坐标系

var ellipsoid=viewer.scene.globe.ellipsoid;

var cartographic=Cesium.Cartographic.fromDegrees(lng,lat,alt);

var cartesian3=ellipsoid.cartographicToCartesian(cartographic);

var x=cartesian3.x;   var y=cartesian3.y;   var z=cartesian3.z;

II:笛卡尔空间直角坐标系转为经纬度坐标

var ellipsoid=viewer.scene.globe.ellipsoid;

var cartesian3=new Cesium.cartesian3(x,y,z);

var cartographic=ellipsoid.cartesianToCartographic(cartesian3);

var lat=Cesium.Math.toDegrees(cartograhphic.latitude);

var lng=Cesium.Math.toDegrees(cartograhpinc.longitude);
var alt=cartographic.height;


更多坐标系转换请参考:
http://blog.youkuaiyun.com/u013929284/article/details/52503295

new Cesium.Cartesian3(xyz)
<think>好的,我现在需要回答用户关于如何在Cesium后处理中获取相机坐标的问题。首先,用户之前询问了如何将ShaderToy的坐标转换代码应用到Cesium后处理中,现在他们可能在进行更复杂的后处理效果,需要获取相机的位置信息。 首先,我需要回忆Cesium中的相关内置变量和函数。已知Cesium提供了一些内置的uniform变量,比如czm_viewerPositionWC,这可能代表相机在世界坐标系中的位置。但需要确认这个变量的准确性,以及是否有其他相关变量可用。 接下来,用户可能需要相机的位置、方向等信息。例如,相机的世界坐标、观察方向、上方向、右方向等。在Cesium中,这些信息通常可以通过czm_view*系列的内置变量来获取,比如czm_viewerPositionWC代表相机的位置,czm_viewRotation代表相机的旋转矩阵,或者czm_viewProjection矩阵的组合。 然后,我需要考虑如何在后处理着色器中访问这些变量。由于后处理阶段通常是在屏幕空间进行的,可能需要将相机的参数传递到片段着色器中。Cesium的后处理阶段是否自动提供这些变量呢?比如,czm_viewerPositionWC是否在后处理中可用?或者是否需要通过其他方式传递? 另外,用户可能希望将世界坐标与屏幕坐标进行转换,或者进行一些基于相机位置的效果,比如雾效、景深等。因此,可能需要解释如何从屏幕空间坐标反推世界坐标,或者如何利用相机的位置和方向来计算光线方向等。 还需要考虑示例代码的正确性。例如,如何正确地在着色器中声明和使用这些内置变量,是否需要包含特定的GLSL库,或者是否有权限访问这些变量。例如,czm_viewerPositionWC可能在某些上下文中不可用,可能需要使用其他方法,比如通过uniform手动传递相机位置。 此外,用户可能对坐标系的转换有疑问,比如世界坐标、相机本地坐标、屏幕坐标之间的关系。需要简要说明这些概念,并展示如何在后处理中获取所需的相机参数。 最后,需要验证提供的信息是否正确。比如,czm_viewerPositionWC是否确实代表相机的位置,或者是否有其他变量如czm_cameraPositionWC更合适。可能需要查阅Cesium的官方文档或源码来确认这些内置变量的定义和用途。 总结步骤: 1. 确定Cesium中用于获取相机位置的内置变量。 2. 解释如何在后处理着色器中访问这些变量。 3. 提供示例代码,展示如何获取相机坐标并可能的使用场景。 4. 提醒注意事项,如坐标系转换、变量可用性等。 5. 确保信息的准确性和实用性,避免误导用户。</think>在Cesium后处理中获取相机坐标,需通过内置的Uniform变量和坐标系转换实现。以下是详细步骤及代码示例: --- ### 一、关键内置变量 Cesium提供以下内置变量用于获取相机信息: 1. **相机位置**:`czm_viewerPositionWC` (世界坐标系中的相机位置,类型`vec3`) 2. **视图矩阵**:`czm_viewMatrix` (将世界坐标转换为相机本地坐标的矩阵) 3. **投影矩阵**:`czm_projectionMatrix` (将相机本地坐标转换为裁剪空间的矩阵) --- ### 二、获取相机坐标的三种方式 #### 方式1:直接获取相机世界坐标 ```glsl // 在片段着色器中直接读取相机位置 vec3 cameraPosition = czm_viewerPositionWC; ``` #### 方式2:通过视图矩阵反向计算 ```glsl // 视图矩阵的逆矩阵 mat4 viewMatrixInverse = czm_inverseView; // 相机位置 = 视图矩阵逆矩阵的平移分量 vec3 cameraPosition = viewMatrixInverse[3].xyz; ``` #### 方式3:从相机参数构造 ```glsl // 通过Cesium相机参数获取(需自定义Uniform传递) uniform vec3 u_cameraPosition; // 在JavaScript中绑定数据 vec3 cameraPosition = u_cameraPosition; ``` --- ### 三、完整后处理示例 #### JavaScript部分(定义后处理阶段) ```javascript const cameraPositionStage = new Cesium.PostProcessStage({ fragmentShader: ` uniform sampler2D colorTexture; varying vec2 v_textureCoordinates; void main() { vec3 cameraPos = czm_viewerPositionWC; // 示例:将相机高度映射为红色通道 float height = cameraPos.z / 1000.0; gl_FragColor = texture2D(colorTexture, v_textureCoordinates) + vec4(height, 0, 0, 1); } `, uniforms: {} }); ``` #### GLSL部分(深度反推世界坐标) 若需将屏幕像素反推回世界坐标,需结合深度缓冲: ```glsl // 获取深度值(需启用深度纹理) float depth = czm_readDepth(depthTexture, v_textureCoordinates); // 反算世界坐标 vec4 worldPosition = czm_windowToWorldCoordinates(vec3(v_textureCoordinates, depth)); vec3 cameraToWorld = worldPosition.xyz - czm_viewerPositionWC; ``` --- ### 四、坐标系对照表 | 坐标类型 | 获取方式 | 典型用途 | |--------------------|----------------------------|-----------------------| | 相机世界坐标 | `czm_viewerPositionWC` | 雾效、距离衰减 | | 视图矩阵 | `czm_viewMatrix` | 坐标转换到相机空间 | | 投影矩阵 | `czm_projectionMatrix` | 裁剪空间操作 | --- ### 五、注意事项 1. **深度缓冲依赖**:反推世界坐标需启用`depthTexture`: ```javascript stage.enabled = true; stage.needsDepth = true; // 关键设置 ``` 2. **性能优化**:频繁访问`czm_viewerPositionWC`时,建议在JavaScript中通过`viewer.camera.positionWC`获取并作为Uniform传递。 3. **坐标系差异**:Cesium使用WGS84椭球坐标系,直接使用世界坐标时需注意单位(米)。 --- 通过以上方法,可在后处理效果中灵活应用相机位置,实现动态雾效、镜头光晕等高级效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值