Python
 Computer >> コンピューター >  >> プログラミング >> Python

個々のフレームをファイルに保存せずにPythonでムービー(アニメーション)を生成する方法

matplotlibのFuncAnimationを利用すると、個々のフレームを画像ファイルとして保存することなく、その場でアニメーション(ムービー)を作成できます。この記事では、粒子の位置を継続的に更新し、最後にscatterインスタンスを返すユーザー定義関数「update」を作成して、動く粒子のアニメーションを描画する方法を解説します。

実装の手順

  • 粒子の初期位置・速度・力・サイズを取得します。

  • figsize=(7, 7) を指定して、新しいfigureを作成、または既存のfigureをアクティブにします。

  • xlimとylimを設定しながら、現在のfigureにaxesを追加し、カレントのaxesとして設定します。

  • 粒子の初期位置をもとに、散布図(scatter)をプロットします。

  • 関数 func を繰り返し呼び出すことでアニメーションを生成します。粒子の位置を更新するためのユーザー定義関数を、FuncAnimationクラスに渡すことができます。

  • plt.show() でfigureを表示します。

サンプルコード

以下のコードでは、20個の粒子がランダムな力を受けながら領域内を動き回る様子をアニメーションで表現しています。

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

dt = 0.005
n = 20
L = 1
particles = np.zeros(n, dtype=[("position", float, 2),
                               ("velocity", float, 2),
                               ("force", float, 2),
                               ("size", float, 1)])

particles["position"] = np.random.uniform(0, L, (n, 2))
particles["velocity"] = np.zeros((n, 2))
particles["size"] = 0.5 * np.ones(n)

fig = plt.figure(figsize=(7, 7))
ax = plt.axes(xlim=(0, L), ylim=(0, L))
scatter = ax.scatter(particles["position"][:, 0], particles["position"][:, 1])

def update(frame_number):
    particles["force"] = np.random.uniform(-2, 2., (n, 2))
    particles["velocity"] = particles["velocity"] + particles["force"] * dt
    particles["position"] = particles["position"] + particles["velocity"] * dt

    particles["position"] = particles["position"] % L
    scatter.set_offsets(particles["position"])
    return scatter,

anim = FuncAnimation(fig, update, interval=10)
plt.show()

コードのポイント

  • 構造化配列(structured array):numpyのdtypeを使って、各粒子の「position(位置)」「velocity(速度)」「force(力)」「size(サイズ)」をひとつの配列で管理しています。

  • update関数:毎フレームごとにランダムな力を加え、単純なオイラー法で速度と位置を更新します。% L による剰余演算で、領域からはみ出た粒子を反対側に折り返しています。

  • set_offsets:scatterオブジェクトの座標だけを差し替えることで、グラフ全体を再描画せずに効率よくアニメーションを実現しています。

  • interval=10:フレーム間隔を10ミリ秒に設定し、滑らかな動きを再現しています。

実行結果

個々のフレームをファイルに保存せずにPythonでムービー(アニメーション)を生成する方法

スクリプトを実行すると、別ウィンドウにアニメーションが表示され、粒子がランダムな力を受けて領域内を動き回る様子を確認できます。このようにFuncAnimationを使えば、中間画像をディスクに書き出すことなく、メモリ上で直接ムービーを生成できるのが大きなメリットです。

  1. USBケーブルなしでAndroidスマホからPCにファイルを転送する6つの方法

    「スマホからノートパソコンへ、USBケーブルを使わずにファイルを転送するにはどうすればいいの?」と悩んだことはありませんか? Androidデバイスからパソコンへデータをコピーするのは、今では日常的な作業です。Android端末とパソコンの間でファイルをやり取りしたいときも、お気に入りの音楽や写真をバックアップしたいときも、手順はとてもシンプルです。この記事では、USBケーブルを使わずにスマホからノートパソコンへファイルを転送する方法を詳しく解説し、データ転送に役立つ便利なソフトウェアもご紹介します。 初心者の方の中には、「USBなしでどうやってAndroidからパソコンにデータを移すのかわか

  2. フォーマットせずに外付けHDDのデータを復元する方法【初心者向け完全ガイド】

    結論から言うと、外付けハードドライブをフォーマットせずにファイルを復元することは可能です。この記事では、フォーマット不要でディスクを修復・復旧するための複数の方法をご紹介します。Windows標準搭載のツールを使う方法もあれば、サードパーティ製ソフトウェアが必要な方法もあります。これらの復元方法をすべて試し尽くすまでは、絶対にディスクをフォーマットしないでください。フォーマットしてしまうと、データが上書きされ復元できなくなる恐れがあります。 フォーマットせずに外付けHDDからデータを取り出す方法 ステップ1:HDD破損の兆候について知る HDDが破損している可能性を示す兆候はいくつもありま