cesium 地球地固转地惯

Cesium 地球三维引擎默认是地固系 ,如果要转地惯系,需要把相机锁定在 ICRF 天文惯性坐标系中固定不动,地球自身持续自转,视觉效果就是:视角盯住星空不转动,地球在画面里缓缓自转。常用于卫星轨道仿真、天文惯性系观测、直观展示地球自转效果。话不多说,直接上代码

javascript 复制代码
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.帧后置更新事件监听

javascript

复制代码
viewer.scene.postUpdate.addEventListener((scene,time)=>{
  • postUpdate:场景每一帧渲染完成后触发的回调,每秒钟执行几十次;适合持续修正相机姿态;
  • time:Cesium 内部儒略日时间 JulianDate,天体坐标、坐标系转换必须依靠这个精确时间计算。

2. 计算惯性系 → 地固系转换矩阵

javascript

复制代码
const icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time);

两个关键坐标系(核心概念)

  1. ICRF 国际天球参考框架(惯性坐标系) 以遥远恒星为基准,完全不随地球自转、岁差章动旋转,属于静止惯性空间,卫星真实轨道就是在这个坐标系下的椭圆;
  2. **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 地固坐标系一直在自转,而相机坐标系不转;最终视觉:画面里地球不停旋转,镜头相对于星空保持静止。
  • 缺点是无法使用自带跟踪,因为相机被用来绑定惯性系坐标了(可以用下面代码解决)。
javascript 复制代码
/**
 * 自定义跟踪函数(固定距离和角度)
 * @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 相机是 "站在地球上",地球自转相机跟着一起转,看不出自转;这段代码每帧强行把相机 "钉在遥远不动的宇宙星空上",地球自己在下方不停打转,完美可视化地球自转。

相关推荐
CVer儿5 小时前
ras转为lps坐标系
数码相机
sltin1 天前
需求到落地:我如何在微信小程序里实现证件照换底、隐私打码与水印相机
数码相机·微信小程序·小程序
恒锐丰小瑞2 天前
率能SS6810H 32V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式,用于POS打印机/安防相机/机器人
嵌入式硬件·数码相机·机器人·硬件工程
恒锐丰小瑞2 天前
率能SS6812T 40V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式(eTSSOP28),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
格林威2 天前
C#图像像素放大:邻域平均、双线性插值实现像素放大的C#实现代码
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
AI的探索之旅2 天前
图像格式与转换一文讲透:相机 / OpenCV / Qt
数码相机·qt·opencv
恒锐丰小瑞2 天前
率能SS6811H 38V/1.6A/双通道H桥驱动芯片,PWM控制接口与低功耗睡眠模式,用于舞台灯光/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
赵药师2 天前
RGBD相机测尺寸Python以及原理详解
数码相机
阿瑞斯官方账号3 天前
多台 CIS 拼接检测现场售后实录:条纹、暗带、拼接错位怎么处理
数码相机·计算机视觉·视觉检测
电化学仪器白超3 天前
MV-CS200-10UC相机参数配置
python·单片机·嵌入式硬件·数码相机·自动化·ltspice