Skip to main content
Glama
Tarunls
by Tarunls

manim-storyboard

Manim 씬의 모든 애니메이션을 하나의 라벨이 붙은 콘택트 시트로 보고, 작성한 스토리보드와 대조하세요.

의도가 포함된 콘택트 시트

97단계 씬의 처음 18단계. 청록색은 렌더링된 부분, 호박색은 의도한 동작입니다.

이유

Manim은 씬이 렌더링되었다고 알려줍니다. 하지만 챕터 제목이 오른쪽 가장자리를 벗어났다거나, 배너가 그 아래 텍스트 위에 겹쳐졌다는 것은 알려주지 않습니다. 이런 것들은 직접 봐야만 알 수 있고, 보기 위해서는 mp4를 스크러빙하거나 타임스탬프를 추측하여 스틸 이미지를 뽑아내야 합니다.

추측은 많은 샘플을 낭비합니다. 두 섹션 사이의 페이드는 검은 프레임이고, 수동으로 고른 타임스탬프의 약 4분의 1이 그 안에 들어갑니다.

더 나은 소스가 있습니다. Manim은 각 self.play() 호출당 하나의 클립partial_movie_files/에 쓰고 순서대로 나열합니다. 각각의 마지막 프레임을 가져오면 애니메이션당 하나의 안정된 프레임을 순서대로 얻을 수 있으며, 낭비되는 것이 없습니다. 이것이 전체 아이디어입니다.

설치

pip install manim-storyboard

PATH에 ffmpeg가 필요하거나, FFMPEG_EXECUTABLEFFPROBE_EXECUTABLE이 바이너리를 가리켜야 합니다. 이는 manim-mcp-server에서 사용하는 것과 동일한 규칙이므로, 기존 설정이 있다면 그대로 작동합니다.

사용법

전체 씬에 대한 하나의 시트:

manim-storyboard sheet scene.py MyScene
97 panels -> storyboard_MyScene.png

각 패널에는 인덱스, 최종 비디오에서의 시작 시간, 지속 시간, 그리고 실제로 실행된 애니메이션 클래스가 표시됩니다:

#012   0:08.5   1.33s
LaggedStart[Write, FadeIn x2]

그룹은 한 단계 확장되어 파일을 열지 않고도 LaggedStart 내부를 볼 수 있습니다. self.wait()는 manim이 자체 클립으로 렌더링하기 때문에 자체 패널을 갖습니다.

큰 씬은 페이지로 나뉩니다:

manim-storyboard sheet scene.py MyScene --range 1-40 --columns 6

이미 manim CLI를 통해 렌더링했고 시트만 원하는 경우:

manim-storyboard sheet scene.py --from-media media/videos/scene/480p15/partial_movie_files/MyScene

사용해보기

examples/에는 LaTeX나 에셋이 없는 작은 씬과 완성된 스토리보드가 있습니다:

manim-storyboard sheet examples/demo_scene.py DemoScene -s examples/storyboard.yaml
manim-storyboard check examples/demo_scene.py DemoScene -s examples/storyboard.yaml

데모 콘택트 시트

스토리보딩

스토리보드는 각 단계가 수행해야 할 작업을 설명하는 YAML 파일입니다. 씬이 존재하기 전에 수동으로 작성하거나, 렌더링에서 뼈대를 생성할 수 있습니다:

manim-storyboard plan scene.py MyScene            # scaffold from what rendered
manim-storyboard plan scene.py MyScene --blank 40 # 40 empty steps to fill in
scene: LarpGuide
steps:
  - at: 1
    section: cold open
    intent: the overheard question fades up on an empty frame
    expect: [FadeIn]
  - at: 7
    intent: the title writes on, RENT-A-GIRLFRIEND FAN
    expect: [Write]
  - at: 9
    intent: pink flash pops on the word FAN
    expect: [Flash]
  - at: 11
    intent: clear everything before chapter one
    expect: [FadeOut]

intent는 사용자를 위한 설명입니다. expect는 해당 단계에서 사용하려는 애니메이션 유형이며, 검증되는 대상입니다:

manim-storyboard check scene.py MyScene -s storyboard.yaml
step 7: [drift] expected FadeIn but rendered Write
step 9: [drift] expected Circumscribe but rendered Flash
step 400: [missing] plan has step 400 but the render stopped at 97

스토리보드를 sheet에 다시 입력하면 모든 패널에 의도가 출력되고, 벗어난 단계는 빨간색으로 표시됩니다:

manim-storyboard sheet scene.py MyScene -s storyboard.yaml

알아두면 좋은 규칙

개수는 선택 사항입니다. expect: [FadeOut]는 "이 단계에서 무언가를 페이드 아웃한다"는 의미이며, 어떤 개수든 통과합니다. 스테이지를 비우는 헬퍼는 그 순간에 있는 mobject의 수만큼 페이드 아웃하며, 하나를 추가할 때마다 계획을 업데이트할 필요가 없어야 합니다. 정확한 개수가 중요할 때는 expect: [FadeOut x6]라고 작성하면 비교가 엄격해지고 순서에 민감해집니다.

부분 계획도 괜찮습니다. expect를 선언한 단계만 검사됩니다. 계획은 시작 부분만 다루고 나머지는 언급하지 않을 수 있습니다. --strict를 전달하면 계획에서 언급되지 않은 렌더링된 단계도 플래그 지정합니다.

설명만 있는 계획은 절대 실패하지 않습니다. intent만 있고 expect가 없는 단계는 시트의 레이블일 뿐, 단언(assertion)이 아닙니다.

그룹 내용은 무시됩니다. expect: [LaggedStart]LaggedStart[Write, FadeIn x2]에 의해 충족됩니다. 래퍼를 일치시키고, 그 자식은 일치시키지 마세요.

MCP

MCP를 통한 동일한 세 가지 도구로, Manim을 작성하는 에이전트가 자신의 출력을 볼 수 있습니다:

pip install "manim-storyboard[mcp]"
python -m manim_storyboard.mcp_server
{
  "mcpServers": {
    "manim-storyboard": {
      "command": "python",
      "args": ["-m", "manim_storyboard.mcp_server"],
      "env": {
        "FFMPEG_EXECUTABLE": "C:\\ffmpeg\\bin\\ffmpeg.exe",
        "FFPROBE_EXECUTABLE": "C:\\ffmpeg\\bin\\ffprobe.exe"
      }
    }
  }
}

storyboard_sheet, storyboard_plan, storyboard_checkstoryboard_from_media를 노출합니다. 이미 실행 중인 manim MCP 서버에 연결하려면:

from manim_storyboard.mcp_server import register
register(my_fastmcp_instance)

Python

from pathlib import Path
from manim_storyboard import record, build, load, check

take = record(Path("scene.py"), "MyScene", quality="low_quality")
plan = load(Path("storyboard.yaml"))

for issue in check(plan, take.steps):
    print(issue.index, issue.kind, issue.message)

build(take.steps, Path("sheet.png"), columns=6, plan=plan)

record()는 한 번의 렌더링 기간 동안 Scene.play를 래핑하여 매니페스트가 디스크의 클립과 정확히 일치하도록 합니다. 렌더링이 예외를 발생시키는 경우를 포함하여 이후에 원래 메서드를 복원합니다.

개발

pip install -e ".[dev]"
pytest

계획 일치 테스트는 manim이나 ffmpeg가 필요하지 않습니다.

라이선스

MIT

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • OCR, transcription, file extraction, and image generation for AI agents via MCP.

  • Generate on-brand images from your AI agent: design, edit, and render templates over MCP.

  • MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Tarunls/manim-storyboard'

If you have feedback or need assistance with the MCP directory API, please join our Discord server