地球の上空を秒速約7.8km(時速約28,000km)という驚異的な超高速で周回する数千機の人工衛星。国際宇宙ステーション(ISS)から気象衛星ひまわり、通信衛星スターリンクに至るまで、これらをWebブラウザ上でリアルタイムに3D描画し、ミリ秒単位の正確さで軌道を追跡するシミュレーターが「SatViewer3D」です。
本記事では、3D地理空間エンジンのデファクトスタンダードであるCesiumJSおよびThree.jsをベースに、NORAD(北アメリカ航空宇宙防衛司令部)の軌道力学モデル「SGP4(Simplified General Perturbations 4)」をブラウザ完結型でリアルタイム同期させるための数学的・アーキテクチャ的工夫を詳しく解説します。
1. サーバー計算モデル vs クライアント計算モデルの比較と決断
従来の衛星追跡Webサービスの多くは、サーバー側(バックエンド)で定期的に衛星座標を計算し、APIを介してクライアントブラウザへJSON形式で座標配列をプッシュ配信するアーキテクチャを採用していました。
しかし、このクラサバ分散方式には以下のような決定的なボトルネックが存在しました:
- サーバーリソースと通信コストの急増: 追跡対象が数千機、同時接続ユーザーが数千人に達した場合、毎秒の座標計算とデータ配信にかかるサーバーCPU負荷と帯域幅コストが指数関数的に増大します。
- ネットワーク遅延によるアニメーションの不自然さ: 秒速8kmで移動する天体の場合、わずか100ミリ秒のネットワーク遅延やパケットロスが数百メートルの描画ズレを生み、滑らかな60fpsの連続補間が困難になります。
そこで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重のレンダリング最適化を施しました:
- PointPrimitiveCollection による一括バッチング: 全衛星の頂点座標とカラー属性を1つの連続したGPU頂点バッファオブジェクト(VBO)にまとめ、1回のドローコールで数千機のポイントスプライトをラスタライズ。
- 軌道ラインのLOD(Level of Detail)動的間引き: ユーザーがカメラを接近させた選択中衛星のみ、1公転分(約90分)の未来軌道パスを高密度ポリラインとして滑らかに描画し、非選択衛星のライン計算をスキップ。
- 日照判定(In-Sunlight)の幾何学的判定: 太陽位置ベクトルと地球半径を比較する円錐状の地球本影(Umbra / Penumbra)判定式を適用し、衛星が地球の夜側に隠れた瞬間に自動減光させるリアルな発光エフェクトをシェーダー内で実行。
4. まとめとWebブラウザにおける宇宙科学シミュレーションの可能性
最新のWeb技術と軌道力学の数理を適切に組み合わせることで、かつてはNASAやJAXAなどの宇宙機関の専用ワークステーションでしか動かせなかった高度なリアルタイム宇宙監視が、手元のノートPCやスマートフォン上のWebブラウザで完全に再現できるようになりました。
SatViewer3Dは、単なるビジュアルツールにとどまらず、人工衛星の運用現場や宇宙科学教育に資するオープンな宇宙状況把握(SSA)プラットフォームとして、今後も機能拡張を続けてまいります。