Pythonで 3Dアニメ「惑星の公転」

ネットでは、Python で3D立体のアニメを作る分かりやすい方法がまとまって提示してあるわけではないので、断片をかき集めるようにして学び、この習作を作りました。例によってアニメとソースコードを載せます。Python 開発環境で実行すると、惑星が公転しつつあるところを、グリグリ自在に視点を変えて眺めることが出来ます。球体を描く精度を落としているのは、自転についてどうなっているか調べるためです。良かったらお試しください。

# Ball-rotation-230315.py
# 惑星が恒星の周りを回るアニメです。
# FuncAnimationの使い方について以下のサイトを勉強させていただきました。感謝します。
# original: https://sabopy.com/py/matplotlib_animation_3/
# modified 2023.03.15   by Kero

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation

import numpy as np

fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')

def update(i,x,y,z,w,ball):
    ball[0].remove()
    x_ = x + 12 * np.cos(w[i])
    y_ = y + 12 * np.sin(w[i])
    ball[0] = ax.plot_surface(x_, y_, z, cmap="ocean")

u = np.linspace(0, 2 * np.pi, 7)
v = np.linspace(0, np.pi, 7)
w = np.linspace(0, 2 * np.pi, 120)

x = 2 * np.outer(np.cos(u), np.sin(v))
y = 2 * np.outer(np.sin(u), np.sin(v))
z = 2 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x*3, y*3, z*3, cmap="plasma")

ax.set_aspect('auto')
ax.set_xlim(-16.1,16.1)
ax.set_ylim(-16.1,16.1)
ax.set_zlim(-16.1,16.1)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.view_init(elev=15) # 視点の仰角を15°に設定。

ball= [ax.plot_surface(x, y, z)]

ani = animation.FuncAnimation(fig, update, 120, fargs=(x,y,z,w,ball), interval=10)
ani.save('Ball-rotation-2.gif', writer="pillow",dpi=200)
plt.show()

コメントを残す

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