レッスン 17:3次元で多面体を回転させる

fig 17

レッスン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(…)” の値などを変えて試行してみてください。

コメントを残す

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