数式やグラフからYouTubeに使えるアニメーションを作るには

YouTubeの科学・技術系の動画を視聴していると、とてもきれいなアニメーションが使われていることがよくありますね。自分が動画を作るときも、波形やグラフを入れたいなあと思うことがありますが、なかなか良いツールが見つかりません。以前には、きゅうべえというツールを使って動画を作ったこともありました。

YouTubeの自分の動画は、現在は撮影はWebカメラ(LogicoolのC920など)で、音声の波形を入れるときはSOCALABSの無料のVSTiのOscilloscopeのウインドウをOBS Studioで合成しています。静止画は後から編集で入れています。

ブロック図やグラフなどは静止画でよければスプレッドシートや、Pythonのmatplotlibを使うのが手っ取り早いですが、その延長でグラフを動画にしたいとなると、スプレッドシートではちょっと難しいですね。

まさにこういった目的のために作られたPythonパッケージ「Manim」を、ちょっとかじってみました。これは平たく言えば、Pythonを使って静止画を大量に描画し、それをFFmpegで動画にエンコードするためのツールキットです。ポイントは数学と親和性が高い設計になっていることで、数式はLaTeXで美しく表示できますし、グラフ描画のためのツールも充実しています。

作りたいアニメーションの内容をPythonで書き下す必要があるので、それなりにハードルは高いのですが、出力の品質はとても良いです。

この10秒ほどの動画は、私のノートPCで数十秒で生成できました。動画といってもアニメーションなので圧縮効率が非常に高く、H.264の720pですがファイルサイズは148KBしかありません。

この動画を生成するコードはManimのサンプルにあったものです。全体で90行弱あるのでここには載せませんが、興味のある方はリンク先を参照してください。

Manimでは、アニメーションはPythonのクラスとして定義し、動画を生成する際にはそのクラスのconstructメソッドが呼ばれます。このコードでは以下のようになっています。

class SineCurveUnitCircle(Scene):
    # contributed by heejin_park, https://infograph.tistory.com/230
    def construct(self):
        self.show_axis()
        self.show_circle()
        self.move_dot_and_draw_curve()
        self.wait()

Manimで動画に登場する図形はMobject(Moving Object)として定義されており、そのplay()メソッドを呼ぶことでアニメーションが生成されます。上のコードではアニメーションのメイン部分はmove_dot_and_draw_curve()で、このメソッドの中でMobjectであるDot(円周上を動いている黄色い点)の動作(軌道や、1フレームごとの座標の更新など)が定義されています。(このサンプルでは、play()の代わりにwait()でアニメーションが生成されているようです。)

Manimには派生版やそれを元にした解説がいろいろあるようですが、「コミュニティ版」がドキュメントが充実していてお勧めだそうです。
こちらにYouTubeでのチュートリアルがあります。インストールしなくても、例題はJupyterNotebookで簡単に動かすことができます。

コミュニティのドキュメントはこちらです。これも解りやすくてお勧めです。

Manim Community Edition
Animating technical concepts is traditionally pretty tedious since it can be difficult to make the animations precise en...

コメント