티스토리 뷰

1일 1마님 시리즈는 마님 documentation에 존재하는 예제 코드를 하루에 하나씩 따라하면서 마님 라이브러리 사용에 익숙해지기 위해 만든 시리즈입니다! 많은 시간을 들이기엔 주인장도 대학원생인지라 부담이 돼서 1일 1마님 시리즈는 간단하게 코드 + 코드 리뷰 + 실행 결과만 작성합니다!

from manim import *

class LagRatios(Scene): # Scene class를 상속받는다.
    def construct(self): 
        ratios = [0, 0.1, 0.5, 1, 2] # lag ratio는 float형태로 받아야 한다.

        # Create dot groups : dot 형태의 이미지를 create
        group = VGroup(*[Dot() for _ in range(4)]).arrange_submobjects()
        groups = VGroup(*[group.copy() for _ in ratios]).arrange_submobjects(buff=1)

        self.add(groups) 
        self.wait(2)

        # Label groups
        self.add(Text("lag_ratio = ", font_size=36).next_to(groups, UP, buff=1.5))
        for group, ratio in zip(groups, ratios):
            self.add(Text(str(ratio), font_size=36).next_to(group, UP))
            self.wait(0.3)
        
        # Animate groups with different lag_ratios
        self.play(AnimationGroup(*[
            group.animate(lag_ratio=ratio, run_time=2).shift(DOWN*2) for group, ratio in zip(groups, ratios)
        ]))
        self.wait(2)

        # Lag_ratio also works recursively on nested submobjects:
        self.play(groups.animate(run_time=1, lag_ratio=0.1).shift(UP * 2))

group에는 VGroup을 이용해 Dot()을 4번 찍은 4개의 점을 하나의 그룹으로 묶은 Mobject를 저장한다. 이때 .arrange_submobjects()를 하지않으면 점이 같은위치에 4개가 찍혀 하나처럼 보이기 때문에 .arrange()또는 .arrange_submobjects()를 이용해서 점을 서로 겹쳐지지 않도록 정렬해준다. 즉, ( . ) 처럼 보이는걸 (. . . .) 처럼 보이게 한다.

groups는 이렇게 (. . . .) 형태로 저장된 group을 copy하는데 ratios의 len만큼 복사한다고 생각하면 된다. (. . . .)가 5개 복사된다고 생각하면 (. . . .)(. . . .)(. . . .)(. . . .)(. . . .) 처럼 될까? 이것도 위와 마찬가지로 그 위치 그대로 5번 찍히기 때문에 (. . . .)하나가 5번 진하게 찍혀 나온다. 역시나 .arrange또는 .arrange_submobjects()를 이용하면 된다. buff는 서로 1만큼 떨어져라 이런의미 margin을 준다고 생각하면 된다.

self.add()는 전달받는 mobject를 전달받는 순서대로 출력한다. 나중에 전달받는것이 더 위로 출력된다. 도장을 찍을때 나중에 찍히는게 미리 찍힌것을 덮어버리는 것 처럼 생각하면 된다.

self.wait()은 애니메이션이 실행되고 약간의 시간을 기다리라는 의미

Text("Your Text", font_size)를 통해 폰트 크기를 설정한 텍스트를 입력할 수 있고, .next_to(target, location)는 target의 상대적인 location으로 Text를 next_to 시키겠다는 의미이다. location은 UP, DOWN, LEFT, RIGHT, UPPERRIGHT(UR이라고써야된다.) UPPERLEFT(UL), DOWNRIGHT(DR), DOWNLEFT(DL)등이 있다.

for문의 경우 파이썬 문법이므로 설명하지 않는다. zip에 대한 개념만 있으면 이해하기 어렵지 않을것이다.

self.play()는 도형이나 텍스트, 그래프 등의 애니메이션을 시작하는 명령어이다. AnimationGroup은 그룹에 속하는 여러가지 animation을 동시에 또는 순차적으로 실행하도록 만드는 container class이다. 마찬가지로 zip 명령어와 list comprehension에 대한 이해만 있다면 group과 ratio 별로 animate method가 생성되고, 이것들이 AnimationGroup으로 전달되어 play될 것을 이해할 수 있을 것이다.

마지막으로 이렇게 AnimationGroup으로 묶어서 play 시킬수도 있지만 그냥 groups자체를 animate해서 play할수도 있다.

 

실행결과

 

참고로 list앞의 *(asterisk)기호는 VGroup으로 리스트 내부의 요소들만 pop해서 전달하겠다는 의미이다. 

asterisk 기호의 의미를 모르겠다면 아래 글을 펼쳐서 읽어보면 좋을듯?

댓글