ikuzakの備忘録

数学関連のツールTeX,Tikz,Manim,Geogebraなどの備忘録です。

【Manim】TransformとReplacementTransformの違い

ManimCE DocsでもTransformReplacementTransformの違いを並べているものの、ちょっとわかりづらかった。

Transform

circle = Circle(radius=1,color=BLUE).shift(LEFT)
square = Square(side_length=2,color=RED).shift(UP+RIGHT)
self.add(circle)
self.wait()
self.play(Transform(circle,square,run_time=5))

普通にTransformを使ってみると、こんな感じ。

Transformの挙動の確認

上記の例に次のように追記してみる。

self.play(circle.animate(run_time=5).shift(UP))
self.wait()
self.play(square.animate(run_time=5).shift(DOWN))

出来上がった動画で確認してみると、 先のTransformでcircleをsquareに変形したが、Mobjectの形状や色がsquareとして定義していたものに変わっただけで、Mobject名はそのままcircleのままらしい。 なので、追記した

self.play(circle.animate(run_time=5).shift(UP))

によって、circle(正方形に変形済み)が上に移動する。

一方、squareは

self.play(square.animate(run_time=5).shift(DOWN))

の記述でようやく表示されているので、Transformによる変形先への影響は何もないのだろう。

ReplacedTransform

circle = Circle(radius=1,color=BLUE).shift(LEFT)
square = Square(side_length=2,color=RED).shift(UP+RIGHT)
self.add(circle)
self.wait()
self.play(ReplacementTransform(circle,square,run_time=5))

普通にReplacementTransformを使ってみると、こんな感じ。

ReplacementTransformの挙動の確認

上記の例に次のように追記してみる。

self.play(square.animate(run_time=5).shift(UP))
self.wait()
self.play(circle.animate(run_time=5).shift(DOWN))

出来上がった動画で確認してみると、 先のReplacementTransformでcircleをsquareに変形したが、Replacementの名の通り、実際に以降はsquareのMobject名で扱えるらしい。 なので、追記した

self.play(square.animate(run_time=5).shift(UP))

によって、上に移動する。

一方、circleは

self.play(circle.animate(run_time=5).shift(DOWN))

の記述で表示されている。 ここで、注意すべきはちゃんと変形先であったsquareの形状と位置だけはReplacementTransformの時点で変わっているというところ。
ということは、ReplacementTransformの挙動としては、

  1. Transformする
  2. 変形前のMobjectがremoveされる。
  3. 変形後のMobjectがaddされる。

ということなのだろう。

どっちを使うか

Mobjectがどんどん違うMobjectに変わっていくような場合に

  • Transformを使うなら元のMobject名が継続
  • ReplacementTransformを使うなら変形先のMobject名に変わる

ことを注意しておこう。
私見だけど、あるMobjectをcopyしたものに次のように

Transform(circle.copy(),square)

名前を付けずにそのまま使用した場合、以後その先に同じMobjectに対しての操作ができなくなっちゃうから、こういうときに

ReplacementTransform(circle.copy(),square)

を使うのが適してるんじゃないかな?

/* -----codeの行番号----- */