如何在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
相关产品推荐
相关产品推荐

