ManimCE DocsでもTransform
とReplacementTransform
の違いを並べているものの、ちょっとわかりづらかった。
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
の挙動としては、
Transform
する- 変形前のMobjectがremoveされる。
- 変形後のMobjectがaddされる。
ということなのだろう。
どっちを使うか
Mobjectがどんどん違うMobjectに変わっていくような場合に
Transform
を使うなら元のMobject名が継続ReplacementTransform
を使うなら変形先のMobject名に変わる
ことを注意しておこう。
私見だけど、あるMobjectをcopy
したものに次のように
Transform(circle.copy(),square)
名前を付けずにそのまま使用した場合、以後その先に同じMobjectに対しての操作ができなくなっちゃうから、こういうときに
ReplacementTransform(circle.copy(),square)
を使うのが適してるんじゃないかな?