2025년 8월 21일 목요일

Manim. 코드로 수학적 애니메이션을 만드는 방법

Manim은 복잡한 수학적 개념을 명료하고 아름다운 애니메이션으로 시각화하기 위해 설계된 파이썬(Python) 라이브러리이다.

Manim 개요

Manim(Mathematical Animation Engine)은 코드를 통해 프로그래밍 방식으로 정밀한 2D 애니메이션을 생성하는 데 사용되는 오픈소스 프레임워크이다. 사용자는 파이썬 클래스와 메서드를 활용하여 도형, 텍스트, 그래프, 공식 등 다양한 시각적 요소를 정의하고, 이들의 생성, 변형, 소멸 등 다채로운 움직임을 제어할 수 있다.

단순한 키프레임(Keyframe) 기반의 애니메이션 도구와 달리, Manim은 모든 시각적 요소를 객체(Object)로 다룬다. 따라서 좌표, 크기, 색상, 투명도 등 객체의 모든 속성을 수치적으로 정밀하게 제어하는 것이 가능하다. 이러한 특징 덕분에 미적분, 선형대수, 물리학 공식 등 추상적인 개념을 직관적으로 이해할 수 있도록 설명하는 영상 콘텐츠 제작에 매우 강력한 성능을 보인다.

더 자세한 정보는 Manim 웹사이트에서 확인할 수 있다.


개발 배경

Manim은 저명한 수학 유튜버인 그랜트 샌더슨(Grant Sanderson)이 자신의 유튜브 채널 '3Blue1Brown'의 콘텐츠를 제작하기 위해 직접 개발한 도구에서 시작되었다. 그는 복잡한 수학 이론을 설명하는 데 기존의 시각 자료나 애니메이션 소프트웨어로는 한계가 있다고 느꼈다. 특히, 수학적 개념의 본질적인 아름다움과 논리적 흐름을 정확하게 표현하기 위해서는 프로그래밍을 통한 완전한 제어권이 필수적이라고 생각했다.

이러한 필요에 의해 2015년부터 Manim을 개인 프로젝트로 개발하기 시작했으며, 그의 영상이 큰 인기를 얻으면서 Manim 역시 전 세계의 교육자, 개발자, 아티스트들로부터 주목받게 되었다. 이후, 그의 독창적인 버전을 기반으로 개발자 커뮤니티가 주도하는 보다 범용적이고 사용하기 쉬운 'Manim Community Edition'이 파생되어 활발하게 발전하고 있다. Manim의 소스코드는 커뮤니티 GitHub 저장소에서 확인할 수 있다.


유사 도구

Manim과 유사하게 코드를 통해 시각적 결과물을 생성하는 라이브러리는 여러 가지가 있으며, 각각 다른 목적과 특징을 가지고 있다.

  • Processing: 시각 예술, 데이터 시각화, 인터랙티브 아트 분야에서 널리 사용되는 오픈소스 프로그래밍 언어 및 환경이다. Java를 기반으로 하며, 초보자가 쉽게 그래픽 프로그래밍에 입문할 수 있도록 설계되었다. 애니메이션 기능도 지원하지만, Manim만큼 수학적 표현에 특화되어 있지는 않다. (Processing 웹사이트)

  • D3.js: 웹 브라우저에서 동적인 데이터 기반 문서를 만들기 위한 자바스크립트(JavaScript) 라이브러리이다. SVG, HTML, CSS를 활용하여 데이터 시각화, 특히 인터랙티브 차트와 그래프를 제작하는 데 매우 강력한 기능을 제공한다. 웹 기반이라는 점에서 Manim과 차이가 있다. (D3.js 웹사이트)

  • Pygame: 파이썬으로 2D 게임을 개발하기 위해 설계된 라이브러리이다. 실시간 사용자 입력 처리와 게임 루프 관리에 중점을 두고 있어, 정해진 스크립트에 따라 렌더링되는 Manim과는 작동 방식과 목적이 다르다. (Pygame 웹사이트)


Manim은 MIT 라이선스를 따르는 완전한 오픈소스 소프트웨어이다. 이는 개인, 교육 기관, 상업적 목적을 포함한 어떠한 용도로든 무료로 사용할 수 있음을 의미한다. 별도의 가입 절차나 유료 플랜 없이 누구나 자유롭게 다운로드하여 설치하고, 소스코드를 수정하거나 재배포하는 것이 가능하다. 모든 기능은 커뮤니티의 자발적인 기여를 통해 개발되고 유지보수된다.


설치 및 사용 방법

Manim을 사용하기 위해서는 파이썬과 몇 가지 시스템 의존성 패키지를 먼저 설치해야 한다.

  1. 파이썬 설치: 공식 웹사이트에서 파이썬 3.8 이상의 버전을 다운로드하여 설치한다.

  2. 시스템 의존성 설치: FFmpeg는 애니메이션을 영상 파일로 렌더링하는 데 필수적인 도구이다. FFmpeg 공식 웹사이트에서 운영체제에 맞게 설치한다. LaTeX는 수식을 렌더링하기 위해 필요하다. MiKTeX(Windows), MacTeX(macOS), TeX Live(Linux) 등을 설치한다.

  1. Manim 라이브러리 설치: 터미널 또는 명령 프롬프트에서 아래의 pip 명령어를 실행하여 Manim을 설치한다.
    pip install manim

  2. 코드 작성: 텍스트 편집기나 IDE(통합 개발 환경)를 열어 파이썬 스크립트(.py) 파일을 생성하고, Manim 문법에 맞게 애니메이션 코드를 작성한다.

  3. 렌더링 실행: 터미널에서 아래와 같은 명령어를 사용하여 작성한 파이썬 파일을 실행하면, 코드가 렌더링 되어 영상 파일(기본적으로 .mp4)이 생성된다.
    manim -pql your_script_name.py YourSceneClassName

-pql은 미리보기(preview)낮은 품질(low quality) 로 빠르게 렌더링하라는 옵션이다.

예제 코드: SquareToCircle

아래 코드는 사각형이 원으로 변형되는 간단한 애니메이션을 생성하는 Manim 스크립트이다.

from manim import *

class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        square = Square()
        square.flip(RIGHT)
        square.rotate(-3 * TAU / 8)
        circle.set_fill(PINK, opacity=0.5)

        self.play(Create(square))
        self.play(Transform(square, circle))
        self.play(FadeOut(square))


  • from manim import *: Manim 라이브러리의 모든 구성요소(클래스, 함수 등)를 현재 스크립트로 가져온다.

  • class SquareToCircle(Scene):: SquareToCircle이라는 이름의 새로운 애니메이션 장면(Scene)을 정의한다. Manim의 모든 애니메이션은 이 Scene 클래스를 상속받아 만들어진다.

  • def construct(self):: 이 메서드 안에 애니메이션의 구체적인 동작과 순서를 기술한다. Manim이 장면을 렌더링할 때 이 construct 메서드를 자동으로 실행한다.

  • circle = Circle() / square = Square(): 화면에 표시될 원(Circle)과 사각형(Square) 객체를 생성하여 각각 circle, square 변수에 할당한다. 아직 화면에 나타나지는 않는다.

  • square.flip(RIGHT): square 객체를 오른쪽 방향(RIGHT 축)을 기준으로 뒤집는다.

  • square.rotate(-3 * TAU / 8): square 객체를 회전시킨다. TAU는 2π (360도)를 의미하는 Manim의 상수이며, 따라서 −135도 만큼 시계 방향으로 회전시킨다.

  • circle.set_fill(PINK, opacity=0.5): circle 객체의 내부를 분홍색(PINK)으로 채우고, 투명도를 50%(0.5)로 설정한다.

  • self.play(Create(square)): 첫 번째 애니메이션을 실행한다. Create는 객체가 점차 그려지며 나타나는 효과이다. 이 줄이 실행되면 앞서 설정된 모양의 사각형이 화면에 그려진다.

  • self.play(Transform(square, circle)): 두 번째 애니메이션을 실행한다. Transform은 첫 번째 객체(square)가 두 번째 객체(circle)의 모양과 속성으로 점진적으로 변형되는 효과를 만든다. 이 줄이 실행되면 사각형이 원으로 변신한다.

  • self.play(FadeOut(square)): 세 번째 애니메이션을 실행한다. FadeOut은 객체가 서서히 투명해지며 사라지는 효과이다. square 객체(이제 원의 모습을 하고 있음)가 화면에서 사라지며 애니메이션이 종료된다.

댓글 없음:

댓글 쓰기