Communitygithub.com

Motion Craft Pro · 动效工坊 Pro

프로그래매틱 모션 그래픽 제작 스킬. Remotion에서 영감을 받은 라이트 디렉터 스택(스토리보드 JSON, 스프링 이징, 씬 헬퍼, Edge TTS 기반 워드 바운더리 캡션, 1080p Canvas 렌더 및 FFmpeg 먹싱)을 제공합니다. Claude Opus의 차분한 편집체 타이포그래피, 넉넉한 여백, 미묘한 스프링 감성이 특징입니다. AI 포토리얼 비디오가 아닙니다.

Motion Craft Pro · 动效工坊 Pro란 무엇인가요?

Motion Craft Pro는 코드 기반 모션 그래픽 제작을 위한 AI 에이전트 스킬입니다. Remotion 스타일의 라이트 디렉터 스택을 제공하여, 스토리보드 JSON 작성, 스프링 이징을 활용한 장면 전환, Edge TTS를 통한 내레이션 및 워드 바운더리 캡션 생성, 1080p Canvas 프레임 렌더, 그리고 FFmpeg를 이용한 최종 합성까지의 전 과정을 지원합니다. `engine.js`, `scenes.js`, `render.js`, `compose.py`, `tts.py`, `film.html`, `storyboard.json` 등 모든 핵심 파일이 동일 디렉토리에 평탄하게 구성되어 있으며, Node 18+, Python 3.9+, Puppeteer(Chrome), FFmpeg 등의 환경이 필요합니다. Claude Opus의 디자인 미학(차분한 편집체 타이포그래피, 넉넉한 여백, 미묘한 스프링)을 기준으로 삼아, 각 장면은 하나의 메시지를 전달하고, 페이드 아웃으로 연결되며, 스프링 파라미터(damping 14–18)가 엄격히 제어됩니다. 주요 워크플로우는 '스토리보드 JSON 작성 → TTS로 실제 길이 측정 후 타임라인 조정 → film.html 채우기 → 4장 이상의 스틸 프레임 품질 검사 → 전체 프레임 렌더 → FFmpeg 합성' 순서로 진행됩니다. AI 포토리얼 비디오가 아닌, 순수 코드로 Canvas에 한 프레임씩 그리는 모션 그래픽 전용이며, 복잡한 3D나 캐릭터 애니메이션, 전체 Remotion 생태계(React, 서버 렌더링 클러스터)는 범위 밖입니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/songyuqiang55-create/motion-craft-pro/tree/master/skills/motion-craft

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Motion Craft Pro · 动效工坊 Pro은(는) 무엇을 하나요?

프로그래매틱 모션 그래픽스. Claude Opus 5.5가 코드로 영상을 만드는 미학과 습관을 기준으로 합니다: 스토리보드 먼저, 더빙 다음, 스틸 프레임 검사, 마지막으로 전체 렌더링.

Kling / Jimeng 같은 AI 생성 비디오가 아닙니다. 모든 장면은 코드가 Canvas에 프레임 단위로 그려냅니다.

먼저 스킬 디렉토리 확인 (매번 필수)

engine.js / scenes.js / render.js / compose.py / tts.py / film.html / storyboard.json 모두 이 SKILL.md와 같은 디렉토리에 위치 (플랫 구조, 하위 폴더 없음).

<스킬 디렉토리> = 이 파일의 상위 디렉토리 절대 경로.

# 경로 자가 진단
python "<스킬 디렉토리>/compose.py" --check

상대 경로 python scripts/compose.py 사용 금지 — 검증 환경에서 찾을 수 없습니다.

의존성

의존성용도
Node 18+render.js
puppeteer-core로컬 Chrome 구동
Chrome / Chromium렌더링
Python 3.9+tts / compose
edge-ttspip install edge-tts
FFmpeg 전체 버전합성 (Playwright 경량 버전 제외)

품질 기준 (이대로 만들면 'Pro')

  1. 기본 1920×1080 (1440×1080 / 1080×1920 / 1080×1080 지원)
  2. 한 화면에 한 가지 내용; 장면 전환은 페이드 아웃; 길게 유지, 짧게 등장
  3. Spring 미세 오버슈트 (damping≈16–18, 과도한 탄성 금지)
  4. 여백: 바깥 여백 ≥ 짧은 변의 8%; 본문은 따뜻한 흰색 #f4f1ea, 강조색은 절제 (기본 청동색 #c4a574)
  5. 제목에 자간 추가; 계층별 글꼴 크기 차이 ≥ 1.5배
  6. 더빙 우선 + 가능한 WordBoundary 자막 내보내기
  7. 먼저 ≥4장 스틸 프레임 검수 후 전체 길이 렌더링
  8. renderFrame(t) 순수 함수: Date.now() / Math.random() 사용 금지

워크플로우 (엄격한 순서)

1. 스토리보드 JSON 작성 (모든 코드보다 먼저)

storyboard.json을 복사하여 storyboard.schema.json에 맞춰 작성:

  • meta: 화면비, 길이, 내레이션 전문, 음색
  • beats[]: id, start, end, type, copy, visual
  • 장면 유형: TitleBeat / BulletReveal / StatCounter / CompareBars / QuoteCard / EndCard

숫자로 말하고, 형용사는 쓰지 마세요. 예: 제목 86px, 등장 0.9s, 유지 2.2s — '좀 더 웅장하게' 같은 표현 금지.

2. TTS → 실제 길이 → 타임라인 재작성

python "<스킬 디렉토리>/tts.py" \
  --text-file narration.txt \
  --out "<작업 디렉토리>/voice.mp3" \
  --voice zh-CN-YunxiNeural \
  --rate=-6% \
  --captions-json "<작업 디렉토리>/captions.json" \
  --captions-vtt "<작업 디렉토리>/captions.vtt"

실제 voice.mp3 길이로 beats[].start/end와 meta.duration을 수정하세요. 시간을 먼저 고정하고 더빙하지 마세요.

자막 설명: Edge TTS가 WordBoundary를 반환하면 글자 단위로 집계합니다. 현재 대부분의 중국어 음색은 SentenceBoundary만 제공하므로, 스크립트가 쉼표/마침표 비율에 따라 구절 단위 VTT로 변환합니다.

3. film.html 채우기 (또는 템플릿 기반 수정)

  • 동일 디렉토리 참조: engine.js, scenes.js (../assets/ 사용 금지)
  • 스토리보드를 페이지에 포함하거나 storyboard.json과 동기화 유지
  • MCScenes.drawScene(...) 호출; 오른쪽 장식은 직접 작성 가능, 내용은 가급적 장면 컴포넌트 사용

4. 스틸 프레임 품질 검사 (필수)

먼저 짧은 샘플을 렌더링하거나 브라우저에서 t를 드래그하거나, 1fps로 주요 지점을 렌더링합니다. 최소한: 시작, 중간, 데이터/비교, 끝을 확인.

확인 항목: 겹침, 텍스트 넘침, 너무 어두운 부분, 정렬, 자막 가독성.

5. 전체 프레임 렌더링

node "<스킬 디렉토리>/render.js" \
  "<작업 디렉토리>/film.html" \
  "<작업 디렉토리>/frames" \
  30 \
  18

6. 합성

python "<스킬 디렉토리>/compose.py" \
  --frames "<작업 디렉토리>/frames" \
  --voice-file "<작업 디렉토리>/voice.mp3" \
  --captions "<작업 디렉토리>/captions.vtt" \
  --out "<작업 디렉토리>/out.mp4" \
  --duration 18 \
  --width 1920 --height 1080

선택 사항: --bgm music.mp3 (내레이션 덕킹), --burn-captions, 또는 --text로 compose가 인라인 TTS를 수행.

7. qa-report.json + 4장 qa-stills 확인

통과하지 못하면 스토리보드/레이아웃을 수정하고 다시 렌더링 — 억지로 제출하지 마세요.

엔진 API (engine.js)

const {
  Ease, spring, springSeg, seg, lerp, beatAlpha,
  glow, beam, drawBackdrop, createParticles, drawParticles,
  drawGrain, drawVignette, drawColorGrade,
  drawTracked, wrapCN, camera, transition, applyWipe,
  divider, card, ring, bars,
  drawCaptions, captionsFromWordBoundaries, layoutGrid, Palette
} = MC;

const { TitleBeat, BulletReveal, StatCounter, CompareBars, QuoteCard, EndCard, drawScene } = MCScenes;

Spring 권장 파라미터 (Claude 미학 기준)

용도dampingstiffnessovershootClamping
제목 등장16–18140–160false (매우 가벼운 바운스 허용)
목록 항목18145true
숫자 애니메이션14120false

화면비

용도크기
기본 가로1920×1080
강의 / 4:31440×1080
세로1080×1920
정사각형1080×1080

layoutGrid(W,H)를 사용하여 여백과 2단 레이아웃을 구하세요.

인도물

  • storyboard.json
  • film.html (재렌더링 가능)
  • voice.mp3 + captions.vtt / captions.json
  • out.mp4 (1080p 등급)
  • qa-report.json + qa-stills/*.png ≥ 4

범위 제한

  • 모션 그래픽스를 제작하며, 실사 촬영이나 확산 모델 비디오가 아님
  • 복잡한 3D / 캐릭터 퍼포먼스 / 유체는 범위 밖
  • Edge TTS는 실제 음성이 아니며, 감정 표현에 한계가 있음
  • 완전한 Remotion 프로젝트(React 생태계, 서버 렌더링 클러스터)는 본 패키지에 포함되지 않음; 본 패키지는 출시 가능한 경량 디렉터 스택

관련 스킬