レッスン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 でも、これまで学習してきたように、自然な思考の流れでアニメが自由に作れます。ご活用ください。