レッスン 18:3次元で地球と月をつくる

Earth and Moon

レッスン18 は本講座の卒業課題です。
真ん中に「ブループラネット(地球)」があり、その周りを月が巡る、しかも月は常に同じ面を地球に向けていて、月の裏側は永久に地球側からは見れない、というアニメーションです。
なぜ月の裏側が見れないのか?妄想してみてください。

# python-3D-graphics-step-by-step-18.py    14/04/2023 by Kero
# (18) make Earth and Moon in 3D

# Preparation 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D
pi = np.pi

# graph area settings
fig = plt.figure(figsize=(6,6)) # 描画領域を大きくします。
ax = fig.add_subplot(111, projection='3d')
ax.set_xlim(-2,2) # x軸を-2.0から2.0まで。
ax.set_ylim(-2,2) # y軸を-2.0から2.0まで。
ax.set_zlim(-2,2) # z軸を-2.0から2.0まで。
ax.set_xlabel("x") # 軸にラベルをつける。
ax.set_ylabel("y") # 同上。
ax.set_zlabel("z") # 同上。

balls = []

# make grids
keido = np.linspace(0, 2*pi, 7) # 上から見て6角形。
ido = np.linspace(0, pi, 7) # 横から見て12角形。

# make Earth
xe = np.outer(np.cos(keido), np.sin(ido))
ye = np.outer(np.sin(keido), np.sin(ido))
ze = np.outer(np.ones(np.size(keido)),np.cos(ido))
earth = [ax.plot_surface(xe, ye, ze, cmap='ocean')]

# make Moon
for t in range(121):
    do = t * pi/60
    x = np.outer(np.cos(keido+do), np.sin(ido)) # 角度doだけ余計に回転させる。
    y = np.outer(np.sin(keido+do), np.sin(ido)) # 同上。
    z = np.outer(np.ones(np.size(keido)),np.cos(ido))
    xm = 0.25 * x + 1.5 * np.cos(do) # 月の大きさと位置を調整。
    ym = 0.25 * y + 1.5 * np.sin(do) # 同上。
    zm = 0.25 * z # 同上。配列のすべての要素に、掛ける数や足す数が反映される。
    moon = [ax.plot_surface(xm, ym, zm, cmap='plasma')]
    balls.append(earth + moon) # パラパラ漫画のひとコマに地球と月の両方を入れる。

anime = animation.ArtistAnimation(fig,balls, interval=10) # 10ミリ秒間隔。
anime.save('python-3D-graphics-step-by-step-18.gif', writer='pillow', dpi=200)
    
plt.show()

“graph area setting” の段落では、新たに軸の設定 “ax.set_xlim(…)” や軸レベルの設定 “ax.set_label(…)” などを加えています。
“make grids” の段落では、経度と緯度のキザミを設定しています。
“make Earth” の段落では、”np.outer(…)” を使って、すんなりと “earth” という「オブジェクトのリスト」を作っています。
“make Moon” では、「for 文」を用いてコマごとに π/60 ずつ自転させています。更に、39から41行目にかけて、大きさ(半径などの長さ)を 0.25倍 = 1/4 にし、地球の中心から地球半径の1.5倍の外側へ移動させています。
43行目の “balls.append(…)” では、地球のオブジェクトリストと月のオブジェクトリストを「足し合わせて」balls に追加しています。
for 文が終わった45行目でArtistAnimation でアニメにし、48行目で全部を表示します。
なお、46行目で gif 形式で保存しています。

お疲れさまでした。
アニメ化には “ArtistAnimation” の他に “FuncAnimation” という方法もありますが、こちらは「クロウト向き」とされています。ArtistAnimation でも、これまで学習してきたように、自然な思考の流れでアニメが自由に作れます。ご活用ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です