小説のネタバレを過分に含みます
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
前書き
最近『三体』シリーズを買って読破しました。
とても面白かったです!個人的には、第一部・第二部が一番面白かった ![]()
その中でも特に、第一部のVRゲームの世界観にとても感銘を受けました。
あれは本当のところ、三体人の住んでいる世界をシミュレーションで再現したものでした。
そして彼らの星系には、なんと3つの恒星があり、それらは複雑な軌道で動きます。
予測不可能な「乱期」の影響で、多くの文明が滅亡に追いやられた・・・。
さて、Qiitaの記事でなぜそんなことを書いているのかというと、プログラマー目線として、「これを再現してみたら面白そうだな〜」と思ったからです。
三体問題は、(おそらく今のところ)解がありませんが、シミュレーションならばステップを進めてその軌道を観察できます。
というわけで、そのシミュレーションを作ってみました。ようやく本題ですね。
完成作品
10通りの初期配置があり、数字の1~9, 0で切り替えられます。
最初の5つはいい感じの配置、後の5つはラグランジュ点の配置(安定する配置)です。
スペースで加速、その速度は上下キーで調節できます。
なかなか面白い動きなので、ぜひ触ってみてください!
詳細
Rust をあまり触ったことがなかったので、折角ということで触ってみました。
Wasm & GitHub Pages でデプロイしています。あとは Codex を使いました。
恒星は質点とみなし、万有引力をステップごとに加えています。
惑星は、質量差が無視できるほど小さいので、恒星の万有引力に引っ張られるだけです。
自転は一旦実装せず、360度のパノラマ映像として見せるようにしました。
(大気の明るさが均一なのは目を瞑ってください。。。)
pub(crate) fn calculate_gravity_norm(star1: &Star, star2: &Star) -> f64 {
let distance_squared = (star2.position - star1.position).norm_squared();
G * star1.mass * star2.mass / distance_squared
}
『三体』の設定だと、恒星の大気層が分厚いため、遠くから見ると小さな「飛星」のように見えます。
しかし、惑星との距離が近づくと大気層が光を散乱するため、急激に恒星の大きさが増大するように観測されます。
(間違っていたらごめんなさいm(_ _)m)
この設定も入れて、遠いところでは小さな点として、一定距離より近づくと急激に大きく見せ、地表から見た画面も、恒星の発光を考慮して大気を明るくしています。
| 飛星状態 | 接近した状態 |
|---|---|
![]() |
![]() |
一応地表がどのくらいの温度になっているかを、棒グラフで見せています。
事前調査した感じ、星系を俯瞰したシミュレーションはいくつかあったのですが、実際に地表の観測者からどう見えるかというのは、あまりシミュレーションするものが無かったようでしたので、これを機に作ってみました ![]()
締め
実際に動かしてみると分かるのですが、あまりにも動きが変則的すぎて、この状況で文明が発展するのは無理だろ!って思いました。
三体人たちが地球に憧れる気持ちがよくわかりましたね。
また、厳密と言えるまでは突き詰めていないので、それなりの計算誤差が出ています。
この点に関してもご容赦頂いて、エンタメの一環としてお楽しみください!



