【scratch】で天体シミュレーションをつくろう!【難易度:★★☆☆☆】




皆様、こんにちは!プロクラスの山足です。

夜空を見上げればすぐに体感できる「宇宙」。僕たちの住んでいる世界ではあるものの、未だ謎だらけ不可解でとても辿り着かない領域に存在するもの。最も近くにあり、最も遠くにある存在、世界中の研究者がその人生をかけて「宇宙」解明に尽力しています。

今回は、そんな「宇宙」について、小学校から習う「太陽系」に関して、scratchを使って簡単な「天体シミュレーション」をつくりたいと思います!

ぜひ自由課題等にもご利用ください!

太陽系の予備知識

scratchでプログラミングをする前に、太陽系についての情報を整理していきましょう。

太陽系は、太陽を中心として公転する惑星の集団、太陽から近い方から「水金地火木土天海(冥)」と呼ばれる惑星群(冥王星は準惑星)を指します。

今回、scratchでは画面サイズが限られておりますので、特に近い「水星、金星、地球、火星」までを取り扱いと思います。

軌道長半径、公転周期

軌道長半径とは、太陽から惑星までの距離を表し、太陽から地球までの距離を基準に1auという距離の単位で表されます。

公転周期とは、太陽の周りを1周するのに掛かる時間を表し、地球が太陽の周りをまわる1年を基準に時間で示します。

水星、金星、地球、火星について、軌道長半径、公転周期を表1にまとめます。

表1. 惑星ごとの軌道長半径および公転周期

惑星名 軌道長半径[au] 公転周期[年]
水星 0.387 0.241
金星 0.723 0.615
地球 1.000 1.000
火星 1.524 1.881

1年の長さ、8時59分60秒!?

1年の長さは、厳密には365日ではありません。

皆様ご存じのように、うるう年や8時59分60秒といったうるう秒を用いて、1年の長さは調整されているのです。

厳密な1年の長さは、

1年=約365.242 189 44日=365日と約5時間49分

といった長さとなります。

プログラム作成

スクリプトの準備

それでは、scratchを立ち上げて、「天体シミュレーション」を作成していきましょう。

まずは、スクリプトを準備します。

今回は、簡単に設定する為、太陽のスプライトと、惑星を4つ準備します。
※解説中では背景をわかりやすく座標のものにしますが、宇宙背景のもので問題ありません。

スプライト名と色を分けてわかりやすくしましょう。また、大きさも適切な数値に設定(解説では、太陽=20、惑星=50)にしましょう。

天体を座標ではなくコスチュームで配置

次に、天体を適切な位置に配置します。

ここで、今回のポイントです。惑星は、簡単に、角度によって太陽の周りを回します。

画面上は基本、座標計算によってスプライトを動かしますが、円運動の場合は、計算がややこしいため、今回は「角度運動」のみで動かせるように工夫します。

まずは、太陽を中心(x,y)=(0,0)に設定しておきましょう。

コスチュームで適切な位置に配置するために、基準点となるスプライトを追加します。
解説では、見た目にわかりやすく「オレンジ」を追加します。※大きさは50

それぞれの惑星を配置する太陽からの距離について、今回は火星が太陽から最も遠い天体となりますので、火星を画面上の最も円運動が出来る外側、y座標の画面内最大=180にします。

残りの天体は、火星の太陽からの距離=180を基準として、表2のようになります。
※その他軌道長半径=180×その他軌道長半径[au]/火星の軌道長半径[au]

表2. 火星から太陽までの距離=180を基準としたそれぞれの惑星までの距離[px]

惑星名 軌道長半径[au] 太陽からの距離[px]
水星 0.387 46
金星 0.723 85
地球 1.000 118
火星 1.524 180

こちらを、オレンジを基準にコスチュームで変更していきましょう。まず、すべての惑星の中心点を画面の中心(x,y)=(0,0)に直します。

まずは火星、オレンジを(x,y)=(180,0)に配置しましょう。

コスチュームの基本ですが、コスチュームで画像をずらすと、中心に○に十字のマークが出てきます。これが、スプライトの中心を示し、その点=座標の位置になるよう設定されています。下の図では、火星のスプライトを中心より少しずらしているため、座標が(x,y)=(0,0)のままで、画面上では右に少しずれていることがわかります。

この性質を利用して、座標が(0,0)のまま、オレンジの基準に重なるように、コスチューム上で火星を適切な位置へずらしていきます。

これで、座標(0,0)のまま、火星を適切な位置に配置することができました。
こうすることによって、コスチュームの中心点を中心に、角度運動のみで、半径=180px上を回すことが可能となります。
※試しに「○度回す」ブロックで角度を動かしてみましょう!

他の天体も同じ方法で、表2を参考に適切な位置に配置していきましょう。

※すべて配置した後、「オレンジ」スプライトは削除しましょう。

角度の動きで公転周期を再現する

全ての惑星を配置できましたので、次は動きを設定していきます。

現実の世界と同じ時間での動きにすると、とても天体の時間規模を待つことはできませんので、本シミュレーション上では1秒で1日進むように設定していきます。

各惑星の1日に回る角度は、1年の厳密の長さ、約365.242日より、表3のようになります。
※1日に回る角度=360[°]÷(公転周期[年]×365.242)

表3. 各惑星の1日に回る角度[°]

惑星名 公転周期[年] 1日に回る角度[°]
水星 0.241 4.090
金星 0.615 1.603
地球 1.000 0.986
火星 1.025 0.962

scratchは約32fps(※2021年8月8日のブログを参照!)のため、ずっと、「1日に回る角度÷32」の角度を回すようにプログラムしましょう。

皆様、こんにちは!プロクラスの山足です。 小中学生は夏休みの真っ最中、夏の宿題は順調に進んでいますでしょうか。自由課題に困っているかもしれ...

また、シミュレーションなので、厳密に各惑星が同タイミングで回転するよう「メッセージブロック」を使用して同じタイミングに回転処理が掛かるようにしていきます。

同じく金星、地球、火星も同じようにプログラムを追加していきましょう。
※マウスのドラッグ等でずれてしまわないように旗を押す⇒座標(0,0)等初期設定も付けましょう。角度90に向けるも判断でつけてください。

以上で、天体シミュレーションの基本形が完成しました!

旗ボタンを押すことで、太陽を中心に各惑星が現実の世界と同じ割合で回り始めます。
この動きを見ると、次に各惑星が一直線上に並ぶのに、途方もない時間がかかることが容易に想像できますね。

こういったシミュレーションを利用して、次に月食や、宇宙上の現象が起こることを予測しているのです。

いまは1日を1秒で再現していますが、2日を1秒(÷16)、4日を1秒(÷8)とすれば、シミュレーション速さを変えることができますので、ぜひトライしてみてください!
※1処理に回る角度=1日に回る角度×○/32 (○を変数)として、表題のようなシミュレーション速度を変えることも可能です。

さいごに

1日を1秒で再現しても、天体の動く速度はとても遅く感じますよね。

実際は更に遅く見えるのですが、天体や太陽までの距離自体の桁数が違い、実際地球は太陽の周りを秒速29.8kmもの途方もない速度で動いていることになります。

更に太陽系自体も天の川銀河を公転しており、厳密には地球は秒速370kmもの速さで動いているとの研究結果もあります。

そんな宇宙の現象を、scratchで一部簡単に再現できることも画期的ですよね。

創造力1つでプログラムはいろんなことが再現可能ですので、ぜひいろんなことにチャレンジしてみて、創造力豊かになれるように頑張っていきましょう!

プロクラスにはスクラッチ講座やUnity講座があります!

よりレベルアップを図りたい皆様に、プロクラスにはプロのプログラマーが教える講座がさまざま用意されています!

興味がある方はぜひご確認ください!

大人が学べるスクラッチ講座もあります!

先生方や保護者の方が学べるスクラッチ講座やUnity講座もありますので、短期間でプログラミングを習得されたい方はぜひご活用ください!