はじめに

数式をわかりやすいアニメーション化できないか調査していたところmanimというものが存在していることを見つけた

https://docs.manim.community/en/stable/index.html

今後学習したことのアウトプットの方法として数式を単純に書くだけではわかりにくいので、アニメーションによる表現で理解しやすくなることを期待して使い方を学ぶ

manimのインストール

公式の手順はこちら https://github.com/3b1b/manim?tab=readme-ov-file#mac-osx

Macの環境で数式を扱う場合にはmactexをインストーする必要がある

brew install ffmpeg mactex

AppleシリコンベースのCPUではCairoをインストールしたほうが良いらしい(インストールしなくても動作はした)

# cairoのインストール
arch -arm64 brew install pkg-config cairo

manim自体はconda環境を作成してインストールを行う

またjupyter notebook上で動画を作成したいので、jupyter-labもインストールする

# conda環境の初期化
conda create -n manim python=3.11 -y

# manimとjupyterlabのインストール
conda install -c conda-forge manim jupyterlab

# jupyterlabの起動
jupyter-lab

jupyter-labでnotebookを開いて、manimのアニメーションを作成してみる

基本的な使い方 円から四角へ

import manim as mn
from manim import *
%%manim -qm CircleToSquare

class CircleToSquare(Scene):
    def construct(self):
        blue_circle = Circle(color=BLUE, fill_opacity=0.5)
        green_square = Square(color=GREEN, fill_opacity=0.8)
        self.play(Create(blue_circle))
        self.wait()
        
        self.play(Transform(blue_circle, green_square))
        self.wait()

%%manimはjupyternotebookでmanimを動かすためのマジックコマンドを表す import前に%%manimuは呼べない

-qmは動画の生成クオリティを表していて、--quality=mを表す。

つまりミディアムクオリティの動画生成を意味している

クオリティを高くする場合-qh, 低くても良い場合-qlを使う

形状の生成アニメーションはCreate以外にもFadeInDrawBorderThenFillなど色々ある

wait()はデフォルト1秒待つ 秒数を指定する場合wait(2)などにする

文字を描画する

図形描画と同時に文字を描画することも可能です

%%manim -qm DrawBlueCircle

class DrawBlueCircle(Scene):
    def construct(self):
        # 円の定義
        circle = Circle()

        # 円の属性を更新すr
        blue_circle = circle.set_color(BLUE).set_opacity(0.5)

        # 文字の定義
        label = Text("青い円を書いています")

        # 文字を青い円の下に配置
        label.next_to(blue_circle, DOWN, buff=0.5)

        # 描画開始
        self.play(Create(blue_circle), Write(label))

playの引数に複数のオブジェクトを渡すことで同時に描画することが可能です。

日本語についても追加の設定をする必要がなく描画できました。(素晴らしい)

文字描画のアニメーションはwrite()以外にもあるので、色々見てみると面白い

https://docs.manim.community/en/stable/reference/manim.animation.creation.html

数式の描画

数式もきれいに書けるの素晴らしい

%%manim -qm CauchyIntegralFormula

class CauchyIntegralFormula(Scene):
    def construct(self):
        formula = MathTex(r"[z^n]f(z) = \frac{1}{2\pi i}\oint_{\gamma} \frac{f(z)}{z^{n+1}}~dz")
        self.play(Write(formula), run_time=3)
        self.wait()

まとめ

manimのインストールとチュートリアルを動かしてみた

簡単にアニメーション付きの図形や日本語や数式を含む文字を描画できることを確認した

図形と数式を連動させて動かしたりより面白い表現を探していきたい