티스토리 뷰

1일 1마님 시리즈는 예제 코드를 하루에 하나씩 따라하면서 마님 라이브러리 사용에 익숙해지기 위해 만든 시리즈입니다! 간단하게 코드 + 코드 리뷰 + 실행 결과만 작성합니다!

from manim import *

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

        plane = NumberPlane(x_range=[-5,5,1], x_length=8, 
                            y_range=[-4,4,1], y_length=6).add_coordinates()
        plane.shift(RIGHT * 2)

        vec1 = Line(start=plane.c2p(0, 0), end = plane.c2p(3, 2), stroke_color=YELLOW).add_tip(tip_width=0.2)
        vec1_name = MathTex('\\vec{v}').next_to(vec1, RIGHT, buff=0.1).set_color(YELLOW)

        vec2 = Line(start=plane.c2p(0, 0), end=plane.c2p(-2, 1), stroke_color=RED).add_tip(tip_width=0.2)
        vec2_name = MathTex('\\vec{u}').next_to(vec2, LEFT, buff=0.1).set_color(RED)
        
        vec3 = Line(start = plane.c2p(3,2),
                    end = plane.c2p(1,3),
                    stroke_color=RED).add_tip(tip_width=0.2)
        
        vec4 = Line(start = plane.c2p(0, 0),
                    end   = plane.c2p(1, 3),
                    stroke_color=WHITE).add_tip(tip_width=0.2)
        vec4_name = MathTex('\\vec{u}+\\vec{v}').next_to(vec4, LEFT, buff=0.1).set_color(WHITE)

        stuff = VGroup(plane, vec1, vec1_name, vec2, vec2_name, vec3, vec4, vec4_name)
        box = RoundedRectangle(height =1.5, width =1.5, corner_radius=0.1, stroke_color=PINK).to_edge(DL)

        T1 = Tex('DrawBorderThenFill').to_edge(UL)
        T2 = Tex('GrowFromPoint').to_edge(UL)
        T3 = Tex('Transform').to_edge(UL)
        T4 = Tex('LaggedStart').to_edge(UL)
        T5 = Tex('FadeIn').to_edge(UL)
        
        self.play(DrawBorderThenFill(plane), Write(T1), run_time=2)
        self.wait()
        self.play(Unwrite(T1))


        self.play(GrowFromPoint(vec1, point=vec1.get_start()), 
                  Write(vec1_name),
                  Write(T2),
                  run_time=2)
        self.wait()

        self.play(GrowFromPoint(vec2, point=vec2.get_start()),
                  Write(vec2_name),
                  run_time=2)
        self.wait()
        self.play(Unwrite(T2))

        self.play(Transform(vec2, vec3), 
                  vec2_name.animate.next_to(vec3, UP, buff=0.1), 
                  Write(T3), run_time=2)
        self.wait()
        self.play(Unwrite(T3))

        self.play(LaggedStart(GrowFromPoint(vec4, point=vec4.get_start())),
                  Write(vec4_name),
                  Write(T4),
                  run_time=3, lag_ratio=1)
        self.wait(2)
        self.play(Unwrite(T4))


        self.play(FadeIn(box), Write(T5))
        self.wait()
        self.play(Unwrite(T5))

        self.play(stuff.animate.move_to(box.get_center()).set(width=1.2), run_time=3)
        self.wait(3)

 

오늘의 버그 : Write() 함수에는 여러가지 Tex를 전달하면 안된다. VGroup으로 묶어서 전달하던지 해야지 하나의 Write()함수에는 하나의 Tex만 넣도록 하자.

  • 오늘 코드는 그냥 Scene class를 상속하므로 def construct(self):로 시작한다.
  • NumberPlane() class는 앞선 포스팅들에서 다룬 적 있기 때문에 생략한다.
  • Line() class를 이용해 만든 Line Mobject에 .add_tip() 메서드를 이용해서 마치 vector인 것 처럼 표현 할 수 있다.
  • NumberPlane.c2p(좌표)는 NumberPlane coordinate상의 좌표로부터 BackGround에 깔린 좌표의 point를 얻는다.
  • 수식을 표현하는 MathTex() class에 .set_color() 메서드를 이용해서 색깔을 입힐 수 있다.
  • RoundedRectangle() class를 이용해서 모서리가 둥근 사각형을 그릴 수 있다.
  • GrowFromPoint(Your Mobject, point = point where you want to start from) class는 Your Mobject를 point로부터 Grow시키는 animation이다. (실행 결과 참고)
  • Transform(Source Mobject, Target Mobject) class는 src를 tgt 형태로 변형시키는 class이다 (실행결과 참고)
  • LaggedStart() class는 애니메이션에 약간씩의 딜레이를 추가하는 기능이다. lag_ratio 값을 변화시키면서 직접 실행해보는 편이 이해가 더 빠를 것이다.
  • 마지막줄에서 VGroup으로 그룹화한 stuff변수에 animate을 줘서 box.get_center() 위치로 move_to 시켰다. 동시에 width를 1.2로 set()하면 결과가 어떻게 되는지 실행 결과를 통해 확인해보자

실행결과

댓글