【Manim】AnimationGroup と Succession
またもや、本業が忙しくてなかなか更新できずにいた。反省。
にも関わらず、アクセス数がぼちぼちあるらしい。感謝。
AnimationGroupとSuccessionの使いどころ
両方ともアニメーションの命令(FlashだったりWiggleだったり)をまとめるものなのだけども。
AnimationGroup
こっちは単純に中にまとめたAnimationを同時ひとまとめにしたAnimationを構成するらしい。
youtu.be
Succession
こちらは中に書かれた順にAnimationを連続したものとしてひとまとめにする、という感じ。
youtu.be
落とし穴があったんだよなぁ…
両方を使う上での注意点
どちらもアニメーションを入れるのは良いが、FadeInとFadeOut(他にもあるかも?)の両方を中に入れると
挙動が想定したものにならない。
FadeOut自体、そもそもSceneに追加されている(画面上に表示されている)Mobjectを対象にしているので、
FadeOutを実行する時点で裏でそのMobjectをaddしているっぽい。(ソースコードまでは未確認だが。)
その影響で'AnimationGroup'や'Succession'の中にFadeOutが入れてあると、そのひとまとめにしたときにaddされるようだ。
なので、以下のような挙動になるようだ。
- 2つの
Dotが最初にaddされる FadeInのために一瞬消えFadeInで現れる。FadeOutで無事(?)消える youtu.be
それでも一連のAnimationとしてまとめられたら管理が楽
ということで、自分なりの解決策としてlistとfor文で回すように。
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)