cesium 地球地固转地惯

cesium 地球地固转地惯
Cesium 地球三维引擎默认是地固系如果要转地惯系需要把相机锁定在ICRF 天文惯性坐标系中固定不动地球自身持续自转视觉效果就是视角盯住星空不转动地球在画面里缓缓自转。常用于卫星轨道仿真、天文惯性系观测、直观展示地球自转效果。话不多说直接上代码class CameraMode { // 相机模式切换 Inertial 地惯 Fixed 地固 cameraMode(cameraMode) { switch (cameraMode) { case Inertial: viewer.scene.postUpdate.addEventListener(this.cameraTrackEci); break; case Fixed: viewer.scene.postUpdate.removeEventListener(this.cameraTrackEci); break; } } // 相机跟踪 ECI 坐标系 cameraTrackEci(scene, time) { if (scene.mode ! Cesium.SceneMode.SCENE3D) { return; } const icrfToFixed Cesium.Transforms.computeIcrfToFixedMatrix(time); if (Cesium.defined(icrfToFixed)) { const camera viewer.scene.camera; const offset Cesium.Cartesian3.clone(camera.position); const transform Cesium.Matrix4.fromRotationTranslation(icrfToFixed); camera.lookAtTransform(transform, offset); } } }1.帧后置更新事件监听javascriptviewer.scene.postUpdate.addEventListener((scene,time){postUpdate场景每一帧渲染完成后触发的回调每秒钟执行几十次适合持续修正相机姿态timeCesium 内部儒略日时间 JulianDate天体坐标、坐标系转换必须依靠这个精确时间计算。2. 计算惯性系 → 地固系转换矩阵javascriptconst icrfToFixed Cesium.Transforms.computeIcrfToFixedMatrix(time);两个关键坐标系核心概念ICRF 国际天球参考框架惯性坐标系以遥远恒星为基准完全不随地球自转、岁差章动旋转属于静止惯性空间卫星真实轨道就是在这个坐标系下的椭圆Fixed 地固坐标系Cesium 默认坐标系和地球牢牢绑定跟着地球 24 小时自转我们日常看地图、地表点位都在这个坐标系。函数含义computeIcrfToFixedMatrix(time)根据当前时刻计算出从惯性 ICRF 坐标系 转换到 地球固连 Fixed 坐标系的 3 阶旋转矩阵包含地球自转、岁差章动天文修正。3. 安全判断矩阵是否有效if (Cesium.defined(icrfToFixed)) {Cesium 规范判空防止矩阵计算失败为undefined导致代码报错。4. 获取当前相机 保存偏移量const camera viewer.scene.camera; const offset Cesium.Cartesian3.clone(camera.position);获取场景相机对象clone复制相机当前相对地心的空间偏移距离保证相机离地球远近不变只修改坐标系旋转规则。5. 转为 4×4 变换矩阵const transform Cesium.Matrix4.fromRotationTranslation(icrfToFixed);把 3×3 旋转矩阵包装成 Cesium 相机需要的 4×4 仿射矩阵平移量为 0只做坐标系旋转。6. 强制相机绑定惯性坐标系最关键camera.lookAtTransform(transform, offset);API 作用lookAtTransform(变换矩阵, 位置偏移)强制改写相机的视图基准坐标系传入 ICRF→地固的转换矩阵等价于告诉相机你的参考系锁定在不动的 ICRF 惯性空间地球所在的 Fixed 地固坐标系一直在自转而相机坐标系不转最终视觉画面里地球不停旋转镜头相对于星空保持静止。缺点是无法使用自带跟踪因为相机被用来绑定惯性系坐标了可以用下面代码解决。/** * 自定义跟踪函数固定距离和角度 * param {Object} entity 跟踪目标 * param {Number} distance 相机距离米 * param {Number} pitch 俯仰角度向下为负 * param {Number} heading 方位角度0为正北 */ const customTrack (entity, distance 1000000, pitch -30, heading 0) { function track(){ const position entity.position.getValue(viewer.clock.currentTime); if (!position !position.x !position.y !position.z) return; // 计算相机位置基于目标位置偏移量 const hpr new Cesium.HeadingPitchRange( Cesium.Math.toRadians(heading), Cesium.Math.toRadians(pitch), distance ); if(viewer.scene.mode 2 ) return // 更新相机 viewer.camera.lookAt(position, hpr); } viewer.scene.postUpdate.addEventListener(track); }通俗大白话理解默认 Cesium 相机是 “站在地球上”地球自转相机跟着一起转看不出自转这段代码每帧强行把相机 “钉在遥远不动的宇宙星空上”地球自己在下方不停打转完美可视化地球自转。