皆さん、こんにちは。データコースのDaichiです。今日はAdvent Calendarの24日目を迎えており、いよいよ残り1日となりました。ちなみに、何の因果か、私は2年連続で24日の担当となってしまいました(笑)。今年も25日の方の前座として頑張っていきたいと思います。
自己紹介
改めましてDaichiと言います。理科大に通う3年生で、主に人工知能の勉強をしています。PGは今年で3年目で、案件は三つぐらいやってた気がします。趣味はらーめん(家系ばっかり)、飲み会(酒というより雰囲気が好き)、ネット小説(最近シャンフロが熱い)、アニメ(呪術、メイドインアビス、ワートリ)、バスケ(フリースローが好き。体育館でシューティングしてるときずっと打ってる)などです。
導入
今回は、精密なアニメーションが作成できるライブラリ"Manim"について紹介します。Manimは、MITの数学教授であるGrant Sanderson氏が開発したライブラリで、YouTubeチャンネル"3Blue1Brown"の動画制作で使用されています。Manimは精密なプログラム・アニメーションのを作るためのエンジンで、数学の解説ビデオを作成するために設計されています。今回は、Manimの特徴やアニメーションの例、さらに自分で作ってみたアニメーションについて紹介します。
今回使うManimはManimコミュニティによって管理されているライブラリで、Grant Sanderson氏や3Blue1Brownとは関係ないです(もちろん原型を作ったのはGrant Sanderson氏だが)。こっちの方が頻繁に更新されているらしい。
Manimの特徴
多様で美しい数学表現
Manimでは多くの数学的概念を美しく表現することができます。数式はもちろん、行列やグラフ、図形、ベクトル表現などにも対応しており、それらを組み合わせることでより複雑な概念をわかりやすく説明することができます。
Pythonのみで作れる
こちらの動画は3Brown1BlueのYouTubeチャンネルで公開されているフーリエ級数についての動画です。この動画は全てPythonのみで作成されています。つまり、.pyファイルを実行するだけで動画が作成できるということです。このような動画を作るためには一般的には動画編集ソフトを使用する必要がありますが、Manimを使用することで動画編集ソフトを使用する必要がなくなります。
インストール方法
ManimのインストールはManimドキュメントのインストールページを参照して、自身の環境に合わせてインストールしてください。
HelloWorld的な...
Manimのアニメーションの基本となる機能について紹介します。まずは、図形を表示する基本的なアニメーションを作成してみましょう。以下の動画を作成するコードを解説していきます。
from manim import *
class CreateSquare(Scene):
def construct(self):
square = Square()
square.set_fill(PINK, opacity=0.5)
self.play(Create(square))
解説
最初の行では、manimライブラリをインポートしています。
from manim import *
Manimを使うときは多くのメソッドを使用するので、このようにしてインポートしておくと便利です。
次の行を見てみましょう。
class CreateSquare(Scene):
def construct(self):
...
ほとんどの場合、アニメーションをスクリプト化するコードは、Scene
クラスのconstruct()
メソッドの中に全て含まれています。construct()
の中で、オブジェクトを作成し、画面に表示し、アニメーションさせることができます。
アニメーションに関わるコードは、
Scene
から派生したクラスのconstruct()
メソッド内に存在しなければいけません。補助関数や数学関数のような他のコードは、クラスの外に存在しても大丈夫です。
その次の二行では、正方形を作成し、色と透明度を設定しています。
square = Square()
square.set_fill(PINK, opacity=0.5)
最後にCreate
アニメーションを使用して、正方形を表示します。
self.play(Create(square))
次はこのアニメーションに少しアレンジを加えてみましょう。以下の動画を作成するコードを解説していきます。
解説
最初の図形を定義する部分は先ほどと同じです。異なる点はset_color
で枠線の色を設定しているところです。
- Square() : 正方形
- Rectangle() : 長方形
Tips : Manimは多くの色がサポートされています。詳しくはこちらを参照
def construct(self):
square = Square()\
.set_fill(PINK, opacity=0.3)\
.set_color(PINK)
rectangle = Rectangle(width=4.0, height=2.0)\
.set_fill(BLUE, opacity=0.3)\
.set_color(BLUE)
...
次の1行では、Create
で正方形を表示し、その図形を二行目のTransform
で長方形に変形させています。
self.play(Create(square))
self.play(Transform(square, rectangle))
class SquareToRectangle(Scene):
def construct(self):
square = Square()\
.set_fill(PINK, opacity=0.3)\
.set_color(PINK)
rectangle = Rectangle(width=4.0, height=2.0)\
.set_fill(BLUE, opacity=0.3)\
.set_color(BLUE)
self.play(Create(square))
self.play(Transform(square, rectangle))
いかがでしょうか?
簡単なコードでここまで綺麗なアニメーションが作れちゃいます。
自分で作ってみた
というわけでここからは自分で作ったアニメーションを自慢もとい紹介していこうと思います。
ピタゴラスの定理の証明
この動画はピタゴラスの定理の証明を感覚的にわかりやすいようにしたアニメーションです。youtube shortsで解説を見かけて、それをトレースしました。
ニュートン法
ニュートン法は、非線形方程式の数値解を求めるための反復法の一つです。与えられた方程式f(x)=0の解を求めることができます。ここでは詳しく説明しません。
メリクリ方程式
初めてこの式を知ったとき感動しました。
最後に
Manimいかがでしたでしょうか? ぱっと見難しそうですけど簡単にアニメーションを作ることができます。今後、もし数学的な事柄を発表したりする機会があれば活用していきたいです。
最後まで読んでいただきありがとうございました。