Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[FOSS4G 2025 Japan] CesiumJSで月を替えてみた

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for hshntmk hshntmk
October 13, 2025

[FOSS4G 2025 Japan] CesiumJSで月を替えてみた

2025/10/12(土)に専修大学生田キャンパスで開催された FOSS4G 2025 Japan でのショートプレゼン枠での発表に使用した資料です。

資料中のリンクは以下
・p.5 Sandcatsle
・p.7 Cesium Documentation - Simon1994PlanetaryPositions
・p.15 https://moon-swapper2-f79920.gitlab.io/
・p.16 https://ssd.jpl.nasa.gov/horizons/

Avatar for hshntmk

hshntmk

October 13, 2025
Tweet

Other Decks in Programming

Transcript

  1. 月の位置の計算 ・Cesiumは内部で「Simon1994PlanetaryPositions」というクラスを使用  ⇛天文学的な式をもとに、 ICRF(国際天文基準座標系)上での月の位置を計算 実査に呼び出す関数: Cesium Documentation - Simon1994PlanetaryPositions const

    posECEF = Cesium.Simon1994PlanetaryPositions .computeMoonPositionInEarthInertialFrame(julianDate, result) 引数: julianDate: number 月の位置を計算するユリウス日。 返り値: Cartesian3 地心慣性系における月の位置 (メートル単位 )。
  2. ICRF と ECEF ICRF(国際天文基準座標系 / International Celestial Reference Frame)  地球の自転に影響されない宇宙固定座標系。Cesiumでは月や惑星などの位置計算に使用。太陽系重心。

     CesiumではGCRF(地心慣性座標系) を使っている ECEF(地心地球固定座標系 / Earth-Centered, Earth-Fixed)  地球に固定された座標系。地球の自転に合わせて回る。  Cesiumの内部表示座標系に使用。 ⇛Cesium上で表示するためにはICRF→ECEFへの変換が必要
  3. ICRFとGCRF ICRF GCRF 名称 国際天文基準座標系 International Celestial Reference Frame 地心天体座標系

    Geocentric Celestial Reference Frame 原点 太陽系重心 地球重心 座標軸 準クエーサ方向(銀河系外天体)に固定 ICRF軸とほぼ一致(差は非常に小さい) 違い 原点が太陽系重心にある 原点が地球にある
  4. ICRF → ECEFへの座標変換 ⇛ 結果はECEF(地球固定座標)での位置(= Cesium上の実表示位置) // 指定した時刻におけるICRF → ECEF

    に変換用の回転行列を返す。 const rot = Transforms.computeIcrfToFixedMatrix(time); // 回転行列と月のICRF座標でECEF座標を返す const posECEF = Matrix3.multiplyByVector(rot, posICRF);
  5. 3Dモデルを月の位置に配置してみる ・モデルを月と同じ座標に entityとして配置 ・取得したECEF座標を CallbackProperty で更新 ⇛ 時間の変化に合わせて位置も更新 const entity

    = viewer.entities.add({ position: new Cesium.CallbackProperty((time) => { const p = moonPositionFixed(time); if (p) lastPos = p; return lastPos; }, false), model: { uri: "/models/jupiter.glb", scale: 142984000/2 } }); 3Dモデルを指定 取得したECEF座標を CallbackProperty で更新 木星の直径 142,984km ※今回 3Dモデルを直径 2mで 作っているので 1/2にする