티스토리 뷰

https://www.youtube.com/watch?v=KHGoFDB-raE

출처는 다음 영상입니다. 해당 포스팅은 파이썬에대한 기초적인 선행지식은 있다고 가정합니다.

 

[3B1B 따라잡기 list]

2023.05.11 - [Computer/코딩 개꿀팁] - [3B1B 따라잡기 with Manim] 1. Manim 설치 with vscode

2023.05.12 - [Computer/코딩 개꿀팁] - [3B1B 따라잡기 with Manim] 2. How to create Scene

2023.05.15 - [Computer/코딩 개꿀팁] - [3B1B 따라잡기 with Manim] 3. Error message 파악하기

2023.05.15 - [Computer/코딩 개꿀팁] - [3B1B 따라잡기 with Manim] 4. Animation Updaters

 

이번 포스팅에서는 숫자를 tracking하면서 변화시키는 ValueTracker를 만들어보자.

일단 숫자를 Create해서 play시켜보자.

class ValueTrackers(Scene):
    def construct(self):

        k = ValueTracker(3.5)
        num = DecimalNumber(font_size=72).set_value(k.get_value())
        
        self.play(FadeIn(num))
        
        self.play(k.animate.set_value(0), run_time=3)
        self.wait(duration=2)

처음 k를 ValueTracker Mobject로 할당하고, 그 값을 3.5로 initialization한뒤, num 변수에 DecimalNumber() 함수를 이용해서 소수형태의 값을 할당하려 한다. 이때 .set_value()를 이용해 num변수의 값을 할당하는데, k.get_value()를 이용해 k의 값을 가져와 num변수에 할당시켰다. font_size는 말그대로 font size이다.

FadeIn은 말 그대로 FadeIn function이다.

k.animate.set_value(0)를 이용해 ValueTracker인 k의 값을 3.5에서 0으로 낮추려한다. 실행 결과를 보자.

3.50이라는 DecimalNumber() Mobject는 play가 되지만 k.animate.set_value(0)는 실행이 되지 않는다. ValueTracker 역시 Updater 기능을 이용해야 비로소 animate가 동작한다. 따라서 코드를 다음과 같이 바꿔줘야한다.

class ValueTrackers(Scene):
    def construct(self):

        k = ValueTracker(3.5)
        # 기존 코드 #
        # num = DecimalNumber(font_size=72).set_value(k.get_value())
        
        # 수정한 코드 #
        num = always_redraw(lambda:DecimalNumber(font_size=72).set_value(k.get_value()))
        
        self.play(FadeIn(num))
        self.play(k.animate.set_value(0), run_time=3)
        self.wait(duration=2)

4장에서 배웠던 것 처럼 always_redraw(labmda : ) 함수를 이용해 updater를 지정해주면 정상적으로 ValueTracking이 되는 것을 확인할 수 있다. 나중에 따로 포스팅 하겠지만 updater는 always_redraw뿐 아니라 다른종류도 많이 존재한다.

ValueTracker의 경우 frame동안에 계속해서 숫자의 변환이 발생해서 도형보다는 encoding시간이 긴 편이다. 

자세히 보면 숫자가 변하는 속도가 일정하지 않다. 숫자의 변화를 시간의 흐름과 맞춰 일정하게 변화시키고 싶으면 다음과 같이 작성하면 된다.

class ValueTrackers(Scene):
    def construct(self):

        k = ValueTracker(5)

        num = always_redraw(lambda:DecimalNumber(font_size=72).set_value(k.get_value()))
        self.play(FadeIn(num))
        
        # 수정된 코드 #
        self.play(k.animate.set_value(0), run_time=5, rate_func=linear)
        self.wait(duration=2)

rate_func=linear 옵션을 통해서 숫자의 변화량을 일정하게 맞출 수 있다. 실행결과를 확인해보자.

숫자가 시간 간격에 맞춰 일정하게 감소하는 것을 확인 할 수 있다.

댓글