天文・宇宙部のほうに途中段階を一度公開してはいたのですが、
いろいろ機能を盛り込み、いったん完成としましたので共有します!
ClaudeCodeとThree.jsでISSのビューアを作りました。
地球が、ちゃんと回った。
その上を、ISSが飛んでいる。
ブラウザの画面の中で。
テクスチャ付きで。
ちゃんと、くるくると。
宇宙が好きだから、最初からテーマは「地球とISS」でした。
そのとき思ったんですよね。
「これだけでも、もう十分じゃないか」と。
……最初は。
Three.jsって何?という人のために
Three.jsは、ブラウザの中に3Dを表示するためのJavaScriptライブラリです。
難しそうに聞こえるかもしれないけど、
「npmインストール」とか「ビルド作業」とか、そういうめんどくさいものは一切ナシでも動きます。
HTMLファイルに数行書けば、3Dの地球が回る。
自分はもともとJavascryptも書けるといえば書けるけど、
Three.jsに関しては「なんか3Dなやつ」というイメージしか持ってなかった。
でも、AIに「地球を3Dで回したいんだけど」と話しかけるだけで、
一緒に形にすることができる時代なんですよね。
ISSの現在位置を「本物」にしたくなった
地球とISSは最初から作った。
でも、ISSは「なんとなくくるくる周回してる」だけで、
現実のISSとは全然違う場所を飛んでいる。
……なんか、もったいないな。
そう思って調べたら、ISSの現在位置を返してくれる無料のAPIがありました(wheretheiss.at)。
緯度・経度をリアルタイムで返してくれる。APIキーなし、完全無料。
これを10秒ごとに取得して、地球の向きをその位置に合わせる。
試しに繋いでみたら、
ISSの直下点がインドのあたりに表示された。
……うわ、ほんとにそこにいるんだ。
なんか、感動した。地図上の話が立体になった感じです。
太陽も、月も、本物の方向から光らせたい
ここから、欲望が増殖していきます笑
ISSの位置が本物になった。
じゃあ、太陽の位置は?
ISSに太陽電池パドルがついてるんだから、
太陽が本物の方向から来ないと「らしく」ない。
天文計算をAIに聞きながら実装しました。
「サブソーラーポイント」(太陽が真上にいる地点)を計算式で出して、
そこから地球の表面を照らす方向を決める。
すると——昼夜の境界線(テルミネーターと言います)が、リアルに動くようになった。
「昼の地球」と「夜の地球」が、
今この瞬間の本物の位置で分かれている。
急に、宇宙っぽくなった。
月も同じ。
天文計算の近似式(Meeus簡易式というやつ)で月の位置を算出して、
本物の方向から浮かぶようにした。
「±数度の誤差はあるよ」とAIに言われたけど、
それでも十分に「宇宙にいる感じ」になった。
「次に見える時間、出してほしい」──通過予測を実装した
ここで、ちょっと欲張りすぎかなと思い始めた。
でも、止まれなかった。
「ISSって夜空で見えるじゃないですか。
次に自分のいる場所で見える時間、出せませんか」
AIにそう聞いたら、「SGP4という軌道計算エンジンがあります」という答えが返ってきた。
SGP4——ISSの軌道を、TLE(軌道要素データ)から精密に予測する計算式です。
衛星を追跡するための、れっきとした天文標準。
これをJavaScriptで動く形(satellite.js)でビューアに組み込んで、
96時間先まで30秒刻みで走査する。
条件は2つ。
「ISSが太陽に照らされていること(でないと見えない)」
「観測地が薄明以降であること(明るすぎても見えない)」
この両方が重なったとき——それが「見えるチャンス」です。
東京で試したら、朝の3時37分に仰角14度で通過予定、という結果が出た。
目覚ましセット!!!!で、実際に外に出て、見えた・・・?
た、たぶん!たぶんあれ!きっと・・・
……「自分で作ったもので(たぶん)ISSを見つけた」という経験は、ちょっと忘れられない。
美しくしたい、という欲望が止まらない
機能を実装するたびに、見た目もこだわりたくなってきた。
AIと話しながら、こんな視覚効果を足していきました:
海のサングリント
海面に太陽が反射して、キラッと光る現象。
スペキュラマップ(海だけ光る素材)と鏡面反射の計算で実現しました。
宇宙写真でよく見る、あの輝き。
ターミネーターの夕焼け色
昼夜の境界線(テルミネーター)が、オレンジ色に染まる。
「昼と夜の間」に夕焼けが走る。
現実の大気散乱を近似した演出です。
天の川バンド+星空3層
背景の星を「等級分布(明るい星は少なく、暗い星は多い)」で並べ直した。
天の川を傾いた大円状に4,500個以上の星で再現。
テクスチャ不要、完全計算で。
軌道パルス
未来の軌道線を、6秒周期で光が走っていく演出。
「ISSがどっちに向かっているか」が直感的に分かる。
(ちょっと見づらいけど)
全部、「やりたいな」と思ったらAIと話して実現してきたものです。
AIがいなかったら、途中で詰んでた
自分で頑張って組んだとしたらものすごい時間がかかって、
いくつかの場面で、自分の力だけなら確実に詰まってたかもしれません。
たとえば——
Three.jsには「対数深度バッファ」という、奥行きを正確に描画するための仕組みがあります。
地球のような「近くて大きいもの」と「月のような遠いもの」を同時に描くと、前後判定がおかしくなる。
実装したとき、月が地球の裏側にあるのにずっと手前に出てきた。
「なぜか」がわからなくて、AIに相談した。
「自作シェーダーに対数深度のチャンクを入れていないからです。
Three.jsは組み込みマテリアルには自動でチャンクを挿入しますが、自作シェーダーには挿入しません。」
……な、なるほど?か、かんぜんにりかい。
4行の追加で直った。
いやー、でもほんと楽しい。
発想や思い付きがすぐ形になり、あーでもない、でもこうしたほうが良いみたいな感じでAIと一緒に作ってるとき特有の感覚——が、なんか楽しいんですよね。
答えを出してもらうのではなく、
「なぜそうなるか」を会話しながら理解していく感じ。
できあがったもの
ブラウザで開けば、今のISSがそこにいます。
太陽も月も、今この瞬間の方向から。
スマホでも動きます(モバイルUIも作りました)。
今も、開いたままにしてる。
ISSって1.5時間で地球を1周するので、
ちょっと目を離すとどこか別の場所にいる。
それがなんか、愛着があります。
まとめ:「遊んでいい」と思えた
仕事のためじゃない。
誰かに頼まれたわけでもない。
ただ宇宙が好きで、地球を回したかっただけ。
でもこだわるたびに楽しくなって、
「この機能、難しそうだからやめよう」を何度も「やっぱりやろう」に変えられた。
Three.jsってなんとなくは・・・知ってた。
SGP4やMeeus簡易式なんて知らなかった。
それでも、形になりました。
もっとISS自体をリアルにしたいなーなんて思いつつ。
Three.js、試してみてください!
みんな3Dのもの作りましょう笑
あ、やばい、生成AIパスポート試験が間近なのにまた遊んじゃってる!!

