You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CesiumJS中定位太阳与月球:获取坐标、视角及绘制连线

CesiumJS 月球位置操作全解

1. 获取月球的笛卡尔坐标

Cesium内部通过Simon1994PlanetaryPositions计算月球位置,这和官方渲染月球时用的模型一致,精度有保障。步骤如下:

  • 先计算月球在地球惯性系(ICRF)中的位置
  • 将惯性系坐标转换为地球固定系(如WGS84)的笛卡尔坐标

代码示例:

// 按需引入Cesium或直接使用全局对象
function getMoonCartesianPosition(date = Cesium.JulianDate.now()) {
    const icrfToFixed = new Cesium.Matrix3();
    // 尝试计算ICRF到固定系的转换矩阵,失败则用TEME转伪固定系
    if (!Cesium.defined(Cesium.Transforms.computeIcrfToFixedMatrix(date, icrfToFixed))) {
        Cesium.Transforms.computeTemeToPseudoFixedMatrix(date, icrfToFixed);
    }
    // 计算月球在地球惯性系的位置
    const moonInertialPos = Cesium.Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame(date);
    // 转换到固定系
    Cesium.Matrix3.multiplyByVector(icrfToFixed, moonInertialPos, moonInertialPos);
    return moonInertialPos;
}

// 调用示例:获取当前时间的月球坐标
const moonPosition = getMoonCartesianPosition();
console.log('月球笛卡尔坐标:', moonPosition);

2. 将视角对准月球

你找到的lookAtMoon是Cesium内部测试用的未公开方法,直接复制到自己代码里就能用,也可以基于它实现自定义视角控制:

方法一:直接使用lookAtMoon函数

function lookAtMoon(camera, date = Cesium.JulianDate.now()) {
    const icrfToFixed = new Cesium.Matrix3();
    if (!Cesium.defined(Cesium.Transforms.computeIcrfToFixedMatrix(date, icrfToFixed))) {
        Cesium.Transforms.computeTemeToPseudoFixedMatrix(date, icrfToFixed);
    }

    const moonPosition = Cesium.Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame(date);
    Cesium.Matrix3.multiplyByVector(icrfToFixed, moonPosition, moonPosition);

    camera.viewBoundingSphere(
        new Cesium.BoundingSphere(moonPosition, Cesium.Ellipsoid.MOON.maximumRadius)
    );
}

// 调用示例:让当前viewer的相机对准月球
lookAtMoon(viewer.camera);

方法二:自定义视角参数

如果需要调整距离或视角角度,可用camera.lookAt:

const moonPosition = getMoonCartesianPosition();
// 设置相机位置(比如从北京上空看向月球)
const cameraPosition = Cesium.Cartesian3.fromDegrees(116.4, 39.9, 1000);
viewer.camera.lookAt(cameraPosition, new Cesium.HeadingPitchRange(0, -Cesium.Math.PI_OVER_2, Cesium.Cartesian3.distance(cameraPosition, moonPosition)));

3. 从观测点向月球绘制连线

使用Cesium的Entity创建折线,连接观测点和月球坐标:

// 定义观测点(比如北京上空)
const observerPosition = Cesium.Cartesian3.fromDegrees(116.4, 39.9, 1000);
// 获取月球坐标
const moonPosition = getMoonCartesianPosition();

// 创建折线实体
const moonLine = viewer.entities.add({
    id: 'moon-line',
    polyline: {
        positions: [observerPosition, moonPosition],
        width: 2,
        material: Cesium.Color.YELLOW,
        clampToGround: false // 不贴地,绘制空间连线
    }
});

// 可选:实时更新连线(跟随月球移动)
viewer.clock.onTick.addEventListener(() => {
    const newMoonPos = getMoonCartesianPosition(viewer.clock.currentTime);
    moonLine.polyline.positions = [observerPosition, newMoonPos];
});

内容的提问来源于stack exchange,提问作者jumpjack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:35:07