Skip to content

Repository files navigation

Sidereum

見上げる空から、太陽系の果てまで

Sidereum(シデレウム)は、ブラウザだけで動く Webプラネタリウム — 天体運行 3D シミュレータです。配信物は index.html 1枚と天体テクスチャ (tex/) だけで、依存ライブラリもバックエンドもありません。実際の星空・月の満ち欠けを再現する地上ビュー、実寸比の太陽系を自由に探索できる宇宙ビュー、そして月面に立って空(天頂近くの地球など)を見上げる月面ビューを備えます。 現在は太陽系を対象に、J2000 ケプラー軌道要素にもとづいて太陽・8惑星・月・冥王星・主要小惑星(ケレス/ベスタ/パラス/ジュノー)の位置を計算し、軌道間隔・天体サイズとも実寸比で表示します。将来的には太陽系以外の惑星系への対応も予定しています。

特徴

  • 依存ライブラリなし・ビルド不要。index.htmltex/ を置くだけで動作(WebGL 使用。テクスチャの読み込みに HTTP 配信が要るので file:// では天体が仮色になる)
  • ケプラー軌道(J2000 軌道要素、ニュートン法による離心近点角の求解)による天体位置計算
  • 軌道間隔・天体の大きさとも実寸比で表示(カメラ相対レンダリングによる float32 精度対策済み)
  • NASA/USGS の探査機実写全球マップをテクスチャとして使用(下記クレジット参照)
  • 日時の指定(1900〜2199年)、現在時刻への同期、再生速度 1秒=1秒 〜 約240年
  • 天文カレンダー(観測地から見えるその年のできごと — 日食・月食・満月 (最大・最小の印つき)・二至二分・地球の近日点/遠日点・衝・留 (逆行の始まり/終わり)・最大離角・月による惑星の掩蔽・水星/金星の太陽面通過・流星群の極大・彗星の近日点通過と地球最接近。見かけが近づくだけの「接近」は載せない — を軌道計算から探して年ごとに一覧にし、選ぶといちばん見やすい時刻の地上ビューへ飛ぶ。済んだものは暗く出す)
  • ガイドツアー(視点・日時・解説をシーン単位で切り替える案内モード。?tour=<id> で共有可)
    • 操作を覚える「はじめての操作」は、実際に操作すると次へ進む。PC / スマホで別の内容を出し分け
  • 日食・月食 (球の影を実際に解いて描く。皆既月食の赤銅色、地球へ落ちる月の本影、木星面を渡る衛星の影、皆既日食の空の暗転とコロナ)
  • 空の色と明るさ (レイリー+ミー散乱の積分。夕焼け・薄明・地球の影が式から出る。星の見え方・Bloom のしきい値・天体に乗るエアライトも同じ積分から取る)
  • 大気差と大気減光 (地平ぎわの天体・恒星・星座線の浮き上がりと、青から失われる減光。日の出入りの太陽が赤く暗いのも、地平近くの星が消えるのもこの式から出る)
  • 天の川 (実測の全天マップ。宇宙・地上・月面のどのビューでも天球に貼る)
  • 黄道光と対日照 (地上・月面ビュー。太陽の方向へ向かう淡い円錐と反太陽点の楕円を、離角と黄緯の経験式で天の川の地図に重ねる。春の宵の西空・秋の明け方の東空で立ち上がる)
  • 星雲・星団・銀河 (メシエ天体 109個 + 二重星団。面輝度で描くので、大きくて淡いものは寄るほど薄く広がる。散開星団は恒星カタログと二重にならないよう弱めてある)
  • 初めて開いたときの導入 (ヘリオポーズのあたりから太陽系へ寄り、寄りきる直前に操作ガイドを出す。画面を触ればいつでも飛ばせる。prefers-reduced-motion の端末では流さない)
  • 「空と地形」をONにすると、地上には遠近の山並みと霞、月面には太陽の方向で陰影が変わるクレーターを表示 (景観は模式的な生成表現。暗い側には地面を見分けるための補助光を追加)
  • 光の滲みは明るい面の階調を保って合成し、雲や大気の縁の白潰れを抑制
  • 地球の雲と地表を別々に照明し、大気の霞と夜景を合成。土星の環は厚さに応じて透過し、本体が落とす影を描画
  • 衛星 22個 (月、火星 2、木星 4、土星 7 = ミマス・エンケラドス・テティス・ディオネ・レア・タイタン・イアペトゥス、天王星 5 = ミランダ・アリエル・ウンブリエル・チタニア・オベロン、海王星 1、冥王星 1)。テクスチャの無いものは色球
  • 小天体: 小惑星帯の代表 4個 (位相は JPL SBDB の要素から)、彗星 7個 (ハレー・スイフト=タットル・テンペル=タットル・ヘール=ボップ・百武・ネオワイズ・紫金山=アトラス。近日点通過日で位相を固定)、太陽系外縁天体 3個 (エリス・マケマケ・ハウメア)。地上ビューでは 8等より暗いものは (選択中を除いて) 描かない
  • 明るい星の固有名 70個 (シリウス・ベガ・北極星など。星座の切替に連動し、画角が広いうちは 1等星だけ)
  • 宇宙ビューで天体を選ぶと、パネルを避けた空き領域へ接近表示する。情報パネルの「接近」「周辺」で表面と近傍を切り替え、「鑑賞」でパネル・ガイド・名前をまとめて隠せる。「戻る」または Esc で復帰し、鑑賞中も画像を保存できる
  • 流星の出現・移動・消滅は再生速度に連動。一時停止中は流星も停止し、高速再生では描画フレームの間に消える流星もあります
  • 天体名検索 (タイトル横の 🔍 か / キー。天体・衛星・探査機・恒星・メシエ天体・星座・流星群を日本語名・英語名・M番号で引く。天体は寄り、空のものはいまのビューのままその方向を向く)
  • 今日のできごと (カレンダーに載る日に、その日初めて開いたときだけダイアログで紹介。「見る」でその場面へ)
  • 共有 (メニュー。いまの画面を PNG に写して見せ、画像を保存 / 共有 (端末の共有シートへ画像・文・リンクを渡す。Instagram や X などのアプリへ) / リンクをコピー を選ぶ。画像の隅に日時・観測地・ロゴ・著作権表示)
  • 火星〜木星間の小惑星帯、月の軌道、自転軸の表示
  • 宇宙ビューで天体へ接近すると、背景の星座線・黄道・経緯線と無関係な軌道・名前を自動で薄くする。注視天体と同じ惑星系の衛星・母天体の名前を優先し、引くと全景の表示へ戻る。接近時の選択マークは四隅の短い印になり、軌道は手前を明るく奥を淡く描く (手動の表示切替はそのまま有効)
  • 明るいところの滲み (Bloom)。メニューで切り替え可
  • タッチ操作対応(モバイルレイアウトあり)

使い方

index.html をブラウザで開くだけです。

  • ドラッグ: 視点回転 / ホイール・ピンチ: ズーム / 天体クリック: 選択・接近
  • 左のボタンで天体を選択(再クリックで解除)
  • 右上の日付・時刻をクリックすると任意の日時へジャンプ、「現在時刻に合わせる」で実時刻に同期
  • メニューの天文カレンダーで、その年に起きることを一覧表示(上の年をタップして切替、「見る」でその場面へ移動)
  • タイトル横の 🔍 (または / キー)で天体・星座・星雲を名前で探して飛ぶ
  • メニューの**共有…**で、いまの画面を画像にして保存・SNS へ投稿、または場面のリンクをコピー
  • メニューのガイドツアーで、視点と解説が順に切り替わる案内モードを開始(← → で移動、自動送りあり)
  • 下部バーで再生/停止、速度調整(−/+ボタンまたはスライダー)、軌道・名前の表示切り替え
  • スマホ・タブレットでは上部の AR で、端末を空へ向けるとその向きの空が出る(実時間・現在地に合わせる)。コンパスのずれは星を実際の位置へドラッグして補正

開発

index.html は生成物です。直接編集しないでください。 編集は src/ 以下を変更し、再生成します。

node tools/build.mjs           # src/ から index.html を生成
node tools/build.mjs --check   # index.html が src/ と一致するか検証 (CI でも実行)

ビルドは Node 標準機能だけで動きます(依存パッケージ・バンドラなし)。圧縮も難読化もしないため、生成物はソースをそのまま連結したものです。

src/page.html      HTML骨格          src/styles.css   CSS
src/data/          天体・言語・テクスチャ・恒星カタログ・星座線
src/core/          数学・軌道計算・状態
src/gl/            WebGL初期化・リソース生成
src/shaders/*.glsl シェーダ16本
src/render/        天体・地上・宇宙・彗星の描画
src/runtime/       メインループ      src/ui/          UI各種
src/main.js        起動処理
tools/build.mjs    ビルド
tex/               天体テクスチャ (ビルド対象外。index.html と一緒に配置する)

注意: これはモジュール分割ではありません

src/**/*.js は独立したモジュールではなく、同一スコープを共有するソース断片です。

  • 連結順そのものが意味を持ちます。順序は tools/build.mjsMANIFEST で固定されており、並べ替えると壊れます(関数宣言のホイスティングに依存した前方参照と、即時実行文の TDZ 依存があるため)
  • 断片を単独の JS ファイルとして扱わないでください。すべて同一スコープ前提で書かれており、src/gl/setup.js は WebGL 初期化失敗時の早期脱出にトップレベル return を使っているため単独では構文的に不正です。構文チェックは連結後に対して行います(tools/build.mjs がビルドのたびに実施)

描画負荷を見る

?perf=1 を付けると、右上に計測が出る (開発用。付けないときは計測も描画もしない)。

http://localhost:8934/index.html?perf=1

フレーム間隔の棒グラフ (16.7ms に目安の線) と、CPU 側の区間ごとの時間・描いた数・解像度と DPR。測れるのは CPU の時間だけgl.* はコマンドを積むだけで、実際に絵を出すのは GPU なので、区間の合計とフレーム間隔は一致しない。読み方はこう:

合計 ≒ 間隔 CPU 律速。区間の内訳がそのまま効く
合計 ≪ 間隔 で 60fps 頭打ち。余力がどれだけあるかは分からない
合計 ≪ 間隔 で 60fps 未満 GPU 律速。メニューの切替 (星雲・星団 / 星座 / 光の滲み / 高解像度テクスチャ) を切って当たりを付ける

実機は GitHub Pages に ?perf=1 を付けて開けばよい (ケーブルは要らない)。

精度について(免責)

教育・可視化を目的とした近似シミュレーションです。天文計算・観測用途の精度はありません。

  • 惑星位置は J2000 平均軌道要素による二体問題のケプラー軌道です(惑星間摂動は無視)
  • 小惑星(ケレス/ベスタ/パラス/ジュノー)の軌道上の位相(初期平均黄経)は概略です
  • 月の位置は ELP-2000 の主要周期項による短縮理論(Meeus 由来、黄経誤差 約0.01°・位相時刻 約数分)+ 測心視差補正で計算しています。楕円軌道・出没・満ち欠け・距離変化(約36〜41万km)を再現しますが、暦計算用途の精度はありません
  • 出没・南中は、J2000 からその日の平均分点への歳差 (IAU1976 の ζ・z・θ) を掛けて求めています。時角の進みは天体ごとに決めます — 恒星時の進み (15.041°/時) から、その天体自身の赤経の動きを引いたもの。太陽ではこれがちょうど 15.000°/時 (平均太陽日の定義) になり、月では 14.5°/時 前後になります。東京の日の入り・日の出・南中は実際との差が1分以内です。ただし赤経赤緯はその瞬間の値で固定して解いている (反復しない) ため、動きの速い月では1分ほど残ります。章動 (±9″) は入れていません
  • 大気差 (地平で 34′、高度5°で 9′、天頂で 0。Sæmundsson の式) を入れています。情報パネルの「高度」は大気差込みの見かけの高度で、地上ビューの描画・照準もこれに揃えてあります。天体だけに掛けると地平ぎわで星座線と星がずれるので、恒星・星座線・黄道・経緯線・天の川にも同じだけ掛けます。これで、地上ビューで太陽の円盤が沈み切る瞬間と一覧の「入」が一致します
  • 食 (日食・月食) は上記の惑星・月の位置から幾何を解いて描いています。起きる・起きないは正しく出ますが、時刻はずれます。月食の接触時刻 (半影入り・本影入り・皆既の始まり終わり) は実際と3分以内ですが、日食は月の位置のわずかなずれが地表に落ちる影の位置へ増幅されて効くため、特定の観測地での時刻はこれより大きく外れます。食の予報には使えません
  • 天文カレンダーの衝・最大離角・留も同じ位置計算から求めています。日付は実際とほぼ一致します。二至二分は 15分以内、地球の近日点・遠日点は 2時間ほど、水星の太陽面通過は 1時間ほどずれます (太陽面に入る・入らないの判定は 1900〜2199年で実際と一致。ただし 1937年5月の縁をかすめる回だけは拾えません)。月による惑星の掩蔽は観測地から見た離角で判定していますが、月の位置の誤差 (約0.01°) が縁ぎりぎりの回に効くことがあります。小惑星は軌道上の位相が概略なので、衝を一覧に載せていません
  • 空の明るさは大気散乱の積分から決めています。単散乱だけでは、視線上の大気がすべて地球の影に入った時点 (天頂で太陽高度 −8°) で薄明が終わってしまうため、本影へにじむ多重散乱を減衰長 20km の指数で足しています。薄明が見えなくなるのは太陽高度 −13.5° あたりで、実際の天文薄明の終わり (−18°) より早い (東京の8月なら日没から66分。実際は91分)。また、実際の薄明は5桁ぶん暗くなるのに対して画面は2桁ほどしか出せないので、暗いところほど感度を上げて描いています (目の順応にあたるもの。生の輝度で出すと市民薄明のうちに真っ黒になります)
  • 天の川は実測の全天マップ (拡散光のみ) を天球に貼ったものです。恒星カタログとは別の層なので、明るい星が二重に出ることはありません
  • 恒星 (宇宙ビューの背景・地上ビューとも) はヨール輝星星表 (視等級6.5以下・約8,400星 ≒ 肉眼で見える全ての星) の実位置・実等級です。色は B-V 色指数にもとづく近似です

画像クレジット

天体表面のテクスチャには、以下のパブリックドメイン画像(米国政府著作物)を使用しています。

天体 元データ クレジット
水星 MESSENGER MDIS Basemap MD3Color 全球モザイク (32 ppd) NASA/Johns Hopkins University APL/Carnegie Institution of Washington
金星 Magellan レーダー全球図 (地表) NASA/JPL
地球 Blue Marble: Land Surface, Shallow Water, and Shaded Topography (57752, 8192×4096) NASA Earth Observatory (Reto Stöckli, NASA/GSFC / Robert Simmon)
地球 (雲) Blue Marble: Clouds (57747, 8192×4096) NASA Earth Observatory
地球 (夜景) Black Marble 2016 (VIIRS DNB) (144898, 13500×6750) NASA Earth Observatory
LRO LROC WAC 全球モザイク (CGI Moon Kit) NASA/GSFC/Arizona State University, NASA Scientific Visualization Studio
火星 Viking MDIM 2.1 カラーモザイク NASA/USGS
木星 Cassini 円筒図法マップ (PIA07782) NASA/JPL/Space Science Institute
冥王星 New Horizons 全球モザイク NASA/JHUAPL/SwRI
ケレス Dawn FC 全球モザイク (DLR, 20 ppd) NASA/JPL-Caltech/UCLA/MPS/DLR/IDA
ベスタ Dawn FC HAMO 全球モザイク (74 ppd) NASA/JPL-Caltech/UCLA/MPS/DLR/IDA
月 (法線) LOLA 標高 (LDEM 16 ppd = 5760×2880, CGI Moon Kit) NASA/GSFC/Arizona State University, NASA Scientific Visualization Studio
火星 (法線) MOLA MEGDR 標高 (16 ppd = 5760×2880) NASA/JPL/GSFC (MGS MOLA Science Team)
水星 (法線) MESSENGER 全球 DEM v2 (665 m = 23040×11520) NASA/Johns Hopkins University APL/Carnegie Institution of Washington/USGS
天の川 Deep Star Maps 2020 の拡散光版 (milkyway_2020_4k.exr, 4096×2048)。明るい恒星 (ヒッパルコス・ティコ) を除いた全天の拡散光。赤道座標 (ICRF/J2000) の正距円筒 NASA/Goddard Space Flight Center Scientific Visualization Studio。Gaia DR2: ESA/Gaia/DPAC

画像は USGS Astrogeology、NASA SVS、NASA Earth Observatory、および Wikimedia Commons 経由で取得し、正距円筒図法へ縮小・JPEG 再圧縮のうえ tex/ に置いています。

天の川だけは HDR (OpenEXR, リニア輝度) なので、縮小のほかに次の処理をしています。①ショットノイズを落とす軽い平滑化 ②いちばん暗い空 (下位15〜20%) が 0 になる黒レベルの引き算 ③sRGB への変換。②は、そのまま出すと空全体がうっすら灰色になり「背景が黒い星空」に見えないため。描画時はさらに 1/3 ほどに落として、肉眼で見た淡い帯の明るさに合わせています。

解像度は2組

アルベド図は 2048×1024 を tex/、4096×2048 を tex/4k/ に同名で置き、ハンバーガーメニューの「高解像度テクスチャ」で切り替えます。既定は端末によらず 2K で、4K は選んだ人にだけ渡します。切り替えると reloadTextures() が同じ GL テクスチャへ読み直すので、描画側は解像度を意識しません。

4K は 1枚あたり 4096×2048×4バイト×1.33 (ミップ込み) ≒ 45 MB で、常駐する14枚では 約 625 MB になります。通る端末でも初回の転送量が数倍になるため、既定では取りに行きません (先読みもしないので、チェックを入れるまで tex/4k/ は 1 バイトも落としません)。

端末で出し分けていた時期もありますが、PC でも GPU は千差万別で、既定で有効 → 最初の読み込みで落ちる → メニューに辿り着けないので直せない、という詰み方をします。既定を軽い側に倒しておけばその袋小路が無くなるので、一律 2K にしました。

ON にしたときは、先に適用してから「保存してよいか」を聞きます。「保存する」を押すまで localStorage には書かないので、確認前に端末が落ちても、開き直せば既定へ戻ります。OFF は安全な向きなので確認せず保存します。

最接近時 (カメラ最小距離 = 半径の1.7倍) には天体の直径が画角より広くなり、見えている半球の経度180°ぶん — 2048 なら 1024 テクセル — を画面いっぱいへ引き伸ばすことになります。2K では解像度が先に尽きるので、4K でようやく等倍に近づきます。

法線図 (月・火星・水星) も同じ2組です。実測の標高 (DEM) から tools の外で焼いています。傾きは「高さ÷水平距離」の物理量で出すので、本来は出力解像度によらないはずですが、細かい斜面を拾えるぶん高解像度側が強く出ます。そのままだと解像度を切り替えたときに「細かくなる」だけでなく「凸凹が強くなる」ので、出力サイズごとに gain を決めて RG チャンネルの標準偏差を揃えています。目標値は旧 1024×512 の実測値で、bodies.jsbody.nrm はその強さを前提に調整されています。結果として、解像度を切り替えても起伏の強さは変わらず、細かさだけが変わります。

元の焼き方の記録が残っていなかったため、旧 1024×512 との厳密な一致は再現できていません (旧ファイルは DEM とどの経度でも相関しませんでした)。符号は L2 最小化と粗いスケールでの相関の符号が一致した組み合わせ (東 = −、北 = +) を採り、実際の陰影がクレーターを窪みとして描くことを目視で確認しています。

なお木星だけは元データ (Cassini PIA07782) が 3601×1801 しかなく、4K は 1.14 倍の拡大になります。それでも 2048 へ落とすより元の情報を保てるので 4K 側に含めています。木星は実際に見えている最小構造が約 120 km = 全周 3,700 px 相当なので、ここが素の上限です。

縮小の扱い

地表はアルベド (シェーダが srgbToLinear で扱う) なのでリニア光で縮小し、雲 (被覆率) と夜景 (光量) はマスクなのでそのまま縮小しています。夜景は陸地の下地を落として街灯りだけ残すため、グレースケール化後に黒レベル 20% を切り上げています。

太陽・土星・天王星・海王星・パラス・ジュノーは、実測の全球マップが存在しない(または動的表現の方が適する)ため、シェーダによるプロシージャル生成です。実写ではありません。土星の環も同様です。

本プロジェクトは NASA・USGS とは無関係であり、両機関による承認・推奨を意味するものではありません。

データ出典

  • 惑星の軌道要素・物理諸元: NASA JPL Solar System Dynamics / NASA Planetary Fact Sheet の公表値にもとづく J2000 平均軌道要素
  • 小惑星・冥王星の軌道要素: JPL Small-Body Database の公表値(位相は概略)
  • 恒星: Yale Bright Star Catalogue, 5th Revised Edition (Hoffleit & Warren 1991、CDS V/50)。事実データの編纂物でありパブリックドメインとして扱われる
  • 月の理論: ELP-2000 の主要周期項 (J. Meeus, "Astronomical Algorithms" 2nd ed., Ch.47 の短縮版)
  • 星座線: d3-celestial (Olaf Frohn, BSD-2-Clause) の constellations.lines を座標ベースで再編集
  • 天の川: NASA SVS Deep Star Maps 2020 の拡散光版 (Gaia DR2 由来。米国政府著作物)
  • 星雲・星団・銀河: OpenNGC (Mattia Verga) から、メシエ天体 109個 + 二重星団 (NGC 869 / 884) の位置・等級・視直径・種別を抜き出したもの (src/data/dso.js)。このデータだけ CC-BY-SA-4.0 — 表示義務と継承条件があるので、差し替えるときは出典と一緒に扱うこと。和名は一般に通用しているものを手で当てた
  • 月の向き: カシニの法則 (自転周期 = 公転周期、極は黄道から 1.54° 傾き、交点は軌道と共通)。光学秤動 (経度 ±8.0°・緯度 ±6.8°) は出るが、物理秤動 (数分角) と日周秤動は省略

フォント

ロゴ (ワードマーク) は Jura Light から SIDEREUM の7文字 (S I D E R E U M) だけを切り出し、src/fonts/jura-logo.woff2 (1.1KB) として @font-facedata: URL で埋め込んでいます。外部リクエストを増やさないためで、7文字しか入っていないので他の文字は自動的に --font-ui へ落ちます。

© 2019 The Jura Project Authors — SIL Open Font License 1.1。著作権表示とライセンスはフォント自身の name テーブルにも入れてあります。

作り直すときは、Google Fonts の latin サブセットから further subset する:

python3 -m fontTools.subset jura-latin.woff2 --text="SIDEREUM" --flavor=woff2 \
  --layout-features='' --no-hinting --desubroutinize --name-IDs=0,1,2,13,14 \
  --output-file=src/fonts/jura-logo.woff2

ライセンス

© 2026 Mashsoft Inc.

コードは MIT License です。埋め込みの天体画像はパブリックドメイン(米国政府著作物)であり、MIT ライセンスの対象外です。

Releases

Packages

Contributors

Languages