レッスン16で作った多面体を、z 軸を軸にして回転させます。
3D アニメーションです。
# python-3D-graphics-step-by-step-17.py 13/04/2023 by Kero
# (17) rotate a ball 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()
ax = fig.add_subplot(111, projection='3d')
# make a ball-like figure
keido = np.linspace(0, 2*pi, 5)
ido = np.linspace(0, pi, 3)
# You can change '5' and '3' numbers to larger ones.
# rotate figure
balls = []
for t in range(121): # You can change '121' to larger number.
do = t * pi/60
x = np.outer(np.cos(keido+do), np.sin(ido))
y = np.outer(np.sin(keido+do), np.sin(ido))
z = np.outer(np.ones(np.size(keido)),np.cos(ido))
ball = [ax.plot_surface(x, y, z, color='lightblue')]
balls.append(ball)
anime = animation.ArtistAnimation(fig,balls, blit=True) # 'blit'で高速化。
anime.save('python-3D-graphics-step-by-step-17.gif', writer='pillow')
plt.show()
Preparation の段落に、 インポート animation を追加しています。
make a ball-like figure の段落では、レッスン16の keido と ido を np.linspace を使ってパクっています。
20行目以降は、レッスン7を思い出してください。
21行目で、パラパラ漫画の各コマを入れる器(balls)を用意します。
23行目からパラパラ漫画を作っていきます。レッスン16のように “np.outer(…)” を使いますが、z 軸を回転軸として少しずつ「自転」させています。八面体の4つの縦の稜線の経度に for 文で π/60 ずつ角度を加えています。
28行目で八面体を作りますが、 “au.plot_surface(…)” はオブジェクトですが “animation” が処理してくれる「リスト」ではないので、[ ] で囲んでリストにして balls の中に追加します。
後はレッスン7と同様です。31行目の “blit=True” は処理を高速化する設定とされていますが、効果ありかどうか分かりません。
一応上手く動くことが確認できたら、角形の数や24行目の “60” や23行目の “range(…)” の値などを変えて試行してみてください。