SatViewer3D開発秘話:CesiumJSとSGP4軌道力学モデルをWebGL上でリアルタイム同期させる技術

📅 2026-08-27 ✍️ prosalmontech #SatViewer3D#CesiumJS#WebGL#SGP4#軌道力学#パフォーマンス最適化

地球の上空を秒速約7.8km(時速約28,000km)という驚異的な超高速で周回する数千機の人工衛星。国際宇宙ステーション(ISS)から気象衛星ひまわり、通信衛星スターリンクに至るまで、これらをWebブラウザ上でリアルタイムに3D描画し、ミリ秒単位の正確さで軌道を追跡するシミュレーターが「SatViewer3D」です。

本記事では、3D地理空間エンジンのデファクトスタンダードであるCesiumJSおよびThree.jsをベースに、NORAD(北アメリカ航空宇宙防衛司令部)の軌道力学モデル「SGP4(Simplified General Perturbations 4)」をブラウザ完結型でリアルタイム同期させるための数学的・アーキテクチャ的工夫を詳しく解説します。

1. サーバー計算モデル vs クライアント計算モデルの比較と決断

従来の衛星追跡Webサービスの多くは、サーバー側(バックエンド)で定期的に衛星座標を計算し、APIを介してクライアントブラウザへJSON形式で座標配列をプッシュ配信するアーキテクチャを採用していました。

しかし、このクラサバ分散方式には以下のような決定的なボトルネックが存在しました:

そこでSatViewer3Dでは、「最新の二行軌道要素形式(TLE: Two-Line Element set)テキストデータ(数十キロバイト)のみを初回に圧縮配信し、クライアント端末のCPU/WebAssembly上でSGP4軌道伝播計算を完全リアルタイム実行する」というエッジコンピューティング設計に舵を切りました。

2. SGP4力学モデルとJ2地球重力ポテンシャル摂動の計算

ニュートン力学における単純なケプラーの法則(二体問題)では、地球が完全な球体であり質点が中心にあると仮定します。しかし現実の地球は、自転の遠心力によって赤道半径が極半径より約21km膨らんだ扁平回転楕円体(WGS84基準)です。

この不均一な質量分布により、地球の重力ポテンシャルには高次の調和級数項(J2, J3, J4摂動)が発生し、衛星の軌道面(昇交点赤経 $\Omega$)や近地点引数 $\omega$ が徐々に回転(歳差運動)します。さらに低軌道(高度200〜500km)では希薄大気による摩擦抗力(Atmospheric Drag)による軌道高度の減衰、高高度では月や太陽の潮汐重力摂動が無視できません。

SGP4モデルは、これら複雑な摂動を解析的に解き明かす標準アルゴリズムです。SatViewer3Dでは、衛星の直交座標系(ECI: 地球中心慣性座標系)をグリニッジ視恒星時(GMST)を用いて地心固定座標系(ECEF)および地理座標系(緯度・経度・高度)へ変換しています:

// ECI座標系(慣性系)からECEF座標系(地球固定系)への時空間変換
function eciToEcef(positionECI, gmstRad) {
    const cosG = Math.cos(gmstRad);
    const sinG = Math.sin(gmstRad);

    // Z軸(地軸)まわりのGMST角回転行列
    return {
        x:  positionECI.x * cosG + positionECI.y * sinG,
        y: -positionECI.x * sinG + positionECI.y * cosG,
        z:  positionECI.z
    };
}

// 経過ミリ秒に基づくリアルタイムSGP4プロパゲーション
function getSatellitePositionAtTime(satrec, targetDate) {
    const jDate = jday(
        targetDate.getUTCFullYear(),
        targetDate.getUTCMonth() + 1,
        targetDate.getUTCDate(),
        targetDate.getUTCHours(),
        targetDate.getUTCMinutes(),
        targetDate.getUTCSeconds() + targetDate.getUTCMilliseconds() / 1000
    );

    const gmst = gstime(jDate);
    const positionAndVelocity = propagate(satrec, targetDate);
    
    if (!positionAndVelocity.position) return null; // 軌道崩壊・大気圏再突入

    const positionECEF = eciToEcef(positionAndVelocity.position, gmst);
    const geodetic = ecefToGeodetic(positionECEF);
    
    return {
        latitude: geodetic.latitude,
        longitude: geodetic.longitude,
        altitudeKm: geodetic.height
    };
}

3. CesiumJS / WebGLのドローコール削減とポイントバッチング

数千機の衛星エンティティ、リアルタイム軌道ライン、昼夜境界線(Terminator)、地球大気シェーダーを同時に描画する際、CesiumJSの標準的な EntityCollection を素朴に使うと、オブジェクトごとに内部シーングラフノードが生成され、ドローコールが数百回に達して画面がカクつきます。

SatViewer3Dでは、以下の3重のレンダリング最適化を施しました:

4. まとめとWebブラウザにおける宇宙科学シミュレーションの可能性

最新のWeb技術と軌道力学の数理を適切に組み合わせることで、かつてはNASAやJAXAなどの宇宙機関の専用ワークステーションでしか動かせなかった高度なリアルタイム宇宙監視が、手元のノートPCやスマートフォン上のWebブラウザで完全に再現できるようになりました。

SatViewer3Dは、単なるビジュアルツールにとどまらず、人工衛星の運用現場や宇宙科学教育に資するオープンな宇宙状況把握(SSA)プラットフォームとして、今後も機能拡張を続けてまいります。

🚀 prosalmontech ポートフォリオ

SatViewer3D、QuakeViewer3D、NihongoChatAI、JPQuizなど、開発中のアプリ・Webサービスを公開中!

トップページでプロダクトを見る