msdd’s blog

deep learning勉強中。プログラム関連のこと書きます。

Manimのサンプルコードを読み解く

f:id:msdd:20200506165826j:plain

はじめに

前回の記事で、数学のアニメーション作成ライブラリManimをインストールして、 サンプル動画を生成してみた。  今回はそのサンプル動画を作ったスクリプトを読み解いていきたい。

www.msdd.info

サンプルスクリプトを読み解く

前回ダウンロードしたリポジトリのフォルダ内にある、example_scenes.pyがサンプルが 書かれているスクリプトである。

url : https://github.com/3b1b/manim/blob/master/example_scenes.py

コードを見てみると、最初にまず、モジュール読み込みをしている文がある。 Manimでは、manimlib.importsのファイルで様々なモジュールを読み込んでいる。 これによって、名前空間を気にせず動画を作るスクリプトを書ける。

from manimlib.imports import *

次に、前回実行したコマンドにあったSquareToCircleについて 見てみる。 コードの中では、SquareToCircleはクラスで定義されており、 Sceneを継承している。 関数として、contructを持っている。

このように動画を作る時には、Sceneクラスを継承したクラスを作って、 その中に関数construct(self)を作って、その関数内に動画でのアニメーション などを書いていくことになる。

class SquareToCircle(Scene): #Sceneクラスを継承したSquareToCircleクラスを作る
    def construct(self):
        circle = Circle() #円を作り、circle変数に割り当てる。シーン上には表示されない
        square = Square() #正方形を作りsquare変数に割り当てる。シーン上には表示されない

        # 先ほど作ったsquareに対して
        square.flip(RIGHT)#正方形を横軸(RIGHT)に対して、フリップ(一回転)させる。
        square.rotate(-3 * TAU / 8) #正方形を3/8だけ逆時計回りに回転させる。TAUは2πのこと。
        # 先ほど作ったcircleに対して
        circle.set_fill(PINK, opacity=0.5) # 円をPINK(ピンク)でopacity(透明度)を0.5に設定して塗りつぶし

        #アニメーションを再生する
        self.play(ShowCreation(square)) # squareをシーン上に生成する
        self.play(Transform(square, circle)) # squareをcircleに変形する
        self.play(FadeOut(square)) #フェードアウトさせる

def construct(self)の中身を見ていく。 まず、circlesquare変数にそれぞれ、Circle()Square()で 円と正方形を作っている。 これらは、Mobjectからの派生クラスで、派生クラスを使って、 アニメーションに登場するオブジェクト(円、正方形などの図形など)を作っていく。 さらに、生成したオブジェクトに対して、回転したり、色を塗ったりする。

その後、self.play(Animation)で引数にAnimationクラスのサブクラスを渡す ことで、順番にアニメーションが作られていく。サンプルでは、self.play()が3つあることから、 3つのアニメーションが作られ、付け加えられていく。 このself.play(Animation)は、継承元のSceneScene.play(Animation)で、 継承しているので、selfで使える。

使われているアニメーションは3つある。 1つ目ShowCreation()Mobject(オブジェクトを)をシーンに描画する。 2つ目Transform(mobject,target_mobject)は、mobjecttarget_mobjectへ変形させる。 3つ目FadeOut(mobject)はフェードアウトさる。 この3つのアニメーションでサンプルは出来ている。

まとめ

サンプルコードの中身を読み解いた。 アニメーションは、Sceneクラスを継承さいたサブクラスで作り、 そのクラスにdef construct(self)で、関数を作りその中に、 アニメーションを記述していく。 シーン内に現れるオブジェクトはMobjectを継承したクラスで、 アニメーションは、Animationを継承している。 アニメーションは、Scene.play(Aniamation)で、作ることができ、 継承しているので、self.play(Animation)で使える。 このself.play(Animation)を繋げていくことで、アニメーションを繋げて作っていく。

次は、オブジェクトやアニメーションの種類などを調べていきたい。