ikuzakの備忘録

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

【Manim】AnimationGroup と Succession

またもや、本業が忙しくてなかなか更新できずにいた。反省。 にも関わらず、アクセス数がぼちぼちあるらしい。感謝。

AnimationGroupとSuccessionの使いどころ

両方ともアニメーションの命令(FlashだったりWiggleだったり)をまとめるものなのだけども。

AnimationGroup

こっちは単純に中にまとめたAnimationを同時ひとまとめにしたAnimationを構成するらしい。
youtu.be

Succession

こちらは中に書かれた順にAnimationを連続したものとしてひとまとめにする、という感じ。
youtu.be

落とし穴があったんだよなぁ…

両方を使う上での注意点

どちらもアニメーションを入れるのは良いが、FadeInFadeOut(他にもあるかも?)の両方を中に入れると 挙動が想定したものにならない。
FadeOut自体、そもそもSceneに追加されている(画面上に表示されている)Mobjectを対象にしているので、
FadeOutを実行する時点で裏でそのMobjectをaddしているっぽい。(ソースコードまでは未確認だが。)
その影響で'AnimationGroup'や'Succession'の中にFadeOutが入れてあると、そのひとまとめにしたときにaddされるようだ。
なので、以下のような挙動になるようだ。

  1. 2つのDotが最初にaddされる
  2. FadeInのために一瞬消え
  3. FadeInで現れる。
  4. FadeOutで無事(?)消える youtu.be

それでも一連のAnimationとしてまとめられたら管理が楽

ということで、自分なりの解決策としてlistfor文で回すように。

class AnimsListExample(Scene):
    def construct(self):
        setA = Circle(radius=2.5,color=RED,fill_opacity=0.25)
        setB = Circle(radius=2,color=BLUE,fill_opacity=0.25)
        sets = VGroup(setA,setB).arrange(buff=LARGE_BUFF*2)
        label_A = MathTex(r"A",color=setA.get_color()).next_to(setA.point_at_angle(135*DEGREES),UL)
        label_B = MathTex(r"B",color=setB.get_color()).next_to(setB.point_at_angle(45*DEGREES),UR)
        labels = Group(label_A,label_B)
        elementA = Dot(setA.get_center()+LEFT * 0.2+UP * 0.5,color=WHITE)
        elementB = Dot(setB.get_center()+RIGHT * 0.1+UP * 0.3,color=YELLOW)
        elements = VGroup(elementA,elementB)
        mapArrow = Arrow(
            start=elementA.get_right(),
            end=elementB.get_left()
        )
        anim_sequence = [
            FadeIn(sets),
            Wait(),
            FadeIn(labels),
            Wait(),
            FadeIn(elements),
            Wait(),
            Write(mapArrow),
            Wait(),
            FadeOut(elements,mapArrow)
        ]
        for anim in anim_sequence:
            self.play(anim)
/* -----codeの行番号----- */