N.Y.Cityのまちかど

PythonAnimation

Pythonで簡単なアニメーションを作る

はじめに

授業資料を作っていて、「等速直線運動」と「等加速度直線運動」の例を見せるため、Pythonでアニメーションを作成した。

環境

AnacondaでインストールしたPython環境+Jupiter Notebook

作り方

Pythonの画像ライブラリPillow(PIL)を使用する。 各コマの画像を生成したあとに、GIFアニメーションファイルとして書き出す。

「等加速度直線運動」

from PIL import Image, ImageDraw

images = [] #各コマを収める配列を宣言

width = 1000 #画面横幅
height = 300 #画面縦幅
center = height // 2 #縦中心位置

color_bk = (0, 0, 0) #黒色を示すベクトル
color_white = (255, 255, 255) #白色を示すベクトル
color_gray = (128,128,128) #グレーを示すベクトル

r=20 #メイン玉の半径
dotr = 2 #軌跡を表すドットの半径

x=-r #メイン玉の初期位置(左側画面外から開始)
t=0 #時刻初期値0
a=0.7 #加速度

dotlist = [] #軌跡点情報を収める配列を宣言

#メイン玉が右画面外にはみ出すまで続ける
while x<=(width + r):
    #等加速度直線運動
    
    v= a*t #速度の算出
    x = 0.5*a*t*t #横位置の算出
    print(f't={t},v={v},x={x}') #デバッグ用画面表示
    
    im = Image.new('RGB', (width, height), color_gray) #コマ画像オブジェクト生成
    draw = ImageDraw.Draw(im)
    
    #時刻が3スロット経過するごとに軌跡を追加する
    if t % 3 == 0:
        dotlist.append(x) #軌跡点を追加
    
    #軌跡点を描画
    for dx in dotlist:
        draw.ellipse((dx-dotr, center - dotr, dx+ dotr, center + dotr), fill=color_white)
    
    #メイン玉を描画
    draw.ellipse((x-r, center - r, x+ r, center + r), fill=color_bk)
    
    #完成したコマを配列に追記する
    images.append(im)
    
    #時刻を進める
    t=t+1

#生成完了
print("done")

#ファイル書き出し
images[0].save('UAM.gif',
               save_all=True, append_images=images[1:], optimize=False, duration=40, loop=0)

ULM.gif

「等速直線運動」

from PIL import Image, ImageDraw

images = [] #各コマを収める配列を宣言

width = 1000 #画面横幅
height = 300 #画面縦幅
center = height // 2 #縦中心位置

color_bk = (0, 0, 0) #黒色を示すベクトル
color_white = (255, 255, 255) #白色を示すベクトル
color_gray = (128,128,128) #グレーを示すベクトル

r=20 #メイン玉の半径
dotr = 2 #軌跡を表すドットの半径

x=-r #メイン玉の初期位置(左側画面外から開始)
t=0 #時刻初期値0
v=18 #速度

dotlist = [] #軌跡点情報を収める配列を宣言

#メイン玉が右画面外にはみ出すまで続ける
while x<=(width + r):
    
    x = v*t #横位置の算出
    print(f't={t},v={v},x={x}') #デバッグ用画面表示
    
    im = Image.new('RGB', (width, height), color_gray) #コマ画像オブジェクト生成
    draw = ImageDraw.Draw(im)
    
    #時刻が3スロット経過するごとに軌跡を追加する
    if t % 3 == 0:
        dotlist.append(x)
    
    #軌跡点を描画
    for dx in dotlist:
        draw.ellipse((dx-dotr, center - dotr, dx+ dotr, center + dotr), fill=color_white)

    #メイン玉を描画
    draw.ellipse((x-r, center - r, x+ r, center + r), fill=color_bk)
    
    #完成したコマを配列に追記する
    images.append(im)
    
    #時刻を進める
    t=t+1

#生成完了
print("done")

#ファイル書き出し
images[0].save('ULM.gif',
               save_all=True, append_images=images[1:], optimize=False, duration=40, loop=0)

UAM.gif


現在ご覧のページの最終更新日時は2023/07/13 18:44:50です。

Copyright (C) N.Y.City ALL Rights Reserved.

Email: info[at]nycity.main.jp