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で簡単に動かすことができます。
コミュニティのドキュメントはこちらです。これも解りやすくてお勧めです。
コメント