Communitygithub.com

Rudywizz/rudywizz-motion

코드로 시네마틱 모션 그래픽 비디오를 제작합니다. 운동 타이포그래피, 3D 타이틀, 지도 경로 애니메이션(세계, 지구본, 터키의 주), 소셜 템플릿(로우더 서드, 캡션, 채팅 스토리, 카운트다운, 막대 차트 경주, 팔로우 CTA), 세피아 역사 다큐멘터리(이미지를 에칭으로 변환), 사용자 클립을 활용한 풀 릴(카메라 움직임, 셰이더 전환, 컬러 그레이딩, 필름 효과) 등을 지원합니다.

rudywizz-motion란 무엇인가요?

rudywizz-motion은 결정론적 렌더링 엔진으로, 헤드리스 Chromium과 WebGL2를 사용하여 모든 프레임을 계산한 후 ffmpeg로 파이프하여 동일한 입력에 대해 항상 동일한 비디오를 생성합니다. 주로 Claude Code, Cursor, Codex와 같은 AI 에이전트를 위한 스킬로 설계되었으며, 명령줄 인터페이스를 통해 작동합니다. 사용자는 간단한 CLI 명령으로 텍스트 애니메이션, 지도 경로, 이미지 에칭, 클립 편집, 소셜 미디어 템플릿 등을 생성할 수 있습니다. 이 스킬은 확장 가능한 JSON 기반 컴포지션 시스템을 제공하여 여러 장면, 전환, 카메라 움직임, 오버레이를 정의할 수 있으며, node engine/cli.mjs render 명령을 통해 렌더링합니다. 주요 특징으로는 다양한 스타일 카탈로그(운동 타이포그래피, 3D, 소셜 및 방송 템플릿), 카메라 프리셋, 전환 효과, 룩(인그레이빙, 스케치, 듀오톤 등), 컬러 그레이딩(teal-orange, kodak, sepia 등)이 있으며, 알파 채널 출력으로 투명 오버레이도 지원합니다.

지원 대상✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/Rudywizz/rudywizz-motion/tree/HEAD/skills/rudywizz-motion

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

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

문서

rudywizz-motion은(는) 무엇을 하나요?

결정론적 렌더러: 모든 프레임이 계산되고(헤드리스 Chromium + WebGL2) ffmpeg로 파이프되므로, 동일한 입력은 항상 동일한 비디오를 생성합니다. 이 폴더는 자체 포함되어 있습니다:

engine/      cli.mjs (진입점), host.js, timeline.js, camera.js, gl/ (셰이더), data/ (지도), fonts/
styles/      스타일당 하나의 폴더 (style.js)
templates/   미리 제작된 컴포지션 (JSON)
assets/demo/ 원본 데모 일러스트레이션 (CC0)

1. 일회성 설정 (첫 번째 렌더링 전에 확인)

RM="${CLAUDE_SKILL_DIR}"                       # 이 SKILL.md가 있는 폴더
[ -f "$RM/engine/cli.mjs" ] || RM=$(ls -dt "${CLAUDE_PLUGIN_ROOT}/skills/rudywizz-motion" ~/.claude/plugins/cache/*/rudywizz-motion/*/skills/rudywizz-motion ~/.claude/skills/rudywizz-motion .claude/skills/rudywizz-motion 2>/dev/null | head -1)
TMP=$(node -p "require('os').tmpdir()")       # bash와 Node가 모두 동의하는 임시 디렉토리 (Windows에서도)
cd "$RM" && npm install --no-audit --no-fund   # playwright 설치 (유일한 종속성)
node engine/cli.mjs doctor                    # Node ✓ ffmpeg ✓ 브라우저 ✓ WebGL2 ✓ — 각 ✗에 대한 해결 방법 출력

사용자 폴더에서 node "$RM/engine/cli.mjs" …로 렌더링을 실행하여 상대 경로가 거기에서 확인되도록 합니다. 브라우저 확인에 실패하면: npx playwright install chromium (또는 RM_CHROME=/path/to/chrome 설정). ffmpeg가 없으면 사용자에게 설치 방법을 알려줍니다(macOS brew install ffmpeg, Windows winget install ffmpeg, Linux apt install ffmpeg).

2. 작업 유형 선택

사용자가 원하는 것수행할 작업
하나의 애니메이션 텍스트/타이틀render <style> --text "…"
지도 / 경로 애니메이션render map-route --set 'route=["İstanbul","Konya"]'
자신의 이미지를 에칭으로 변환render image --image photo.jpg --look engrave --grade sepia --film 0.6
자신의 클립에 카메라 움직임 적용render clip --clip in.mp4 --camera handheld --set speed='"ramp-mid"'
편집기용 투명 오버레이 (로우더 서드, 캡션, CTA)render lower-third --text "이름 / 역할" --alpha --out name.mov
다중 장면 릴 / 다큐 / 티저 / 인트로init reel.json 또는 템플릿에서 시작하여 편집 (4번 섹션)

템플릿: node engine/cli.mjs templates - 한 줄 설명과 함께 모두 나열합니다. 사용자의 에셋 옆에 복사(cp "$RM/templates/<name>.json" .), 텍스트/경로 편집, 렌더링.

3. 워크플로우 (항상)

  1. 스타일, 텍스트, 형식(기본 9:16 1080×1920), 카메라, 그레이드를 결정합니다.
  2. 먼저 스틸 샷을 확인하세요 — 저렴하고 레이아웃 문제를 잡아냅니다: node "$RM/engine/cli.mjs" still <style|comp.json> --at 2.5 --size 540 --out "$TMP/check.png" → PNG를 열어 확인합니다. 2~3개의 순간(각 장면의 시작, 중간, 끝)을 확인합니다. warning/error 줄을 읽으세요: 오타를 지적하고 올바른 키를 제안합니다.
  3. 렌더링: node engine/cli.mjs render … --out out.mp4
  4. 확인: ffprobe -v error -show_entries format=duration -of csv=p=0 out.mp4로 한두 프레임을 캡처합니다.
  5. 파일을 한 줄 컨텍스트와 함께 전달합니다.

경험 법칙

  • 짧은 텍스트가 좋습니다: 줄당 1~6단어, 최대 ~4줄. 줄바꿈에는 " / " 또는 \n을 사용하세요.
  • 텍스트에 ğ/ş/ı/İ가 있으면 터키어 대소문자가 자동으로 적용됩니다. 그렇지 않으면 터키어 텍스트의 경우 --lang tr을 전달합니다 (i → İ).
  • 렌더링은 CPU 집약적입니다: 1080p 프레임당 약 0.2~0.5초. --size 540으로 미리보기하고 최종은 1080p로 하세요.
  • 사용자의 명시적 동의 없이 웹에서 이미지/클립을 다운로드하지 마세요. 사용자의 파일을 사용하세요.
  • 투명 오버레이: --alpha --out file.mov (ProRes 4444) 또는 .webm.
  • 음악: --audio song.mp3 및 --bpm N을 사용하여 beat-cut, lyric-video 및 beat-punch 카메라가 박자에 맞춰지도록 합니다.

4. 컴포지션 JSON

{
  "format": "9:16",
  "lang": "tr",
  "bpm": 96,
  "audio": "song.mp3",
  "look": { "grade": "teal-orange", "bloom": 0.3, "grain": 0.05, "leak": 0.2, "aberration": 0.3,
            "vignette": 0.3, "film": 0, "weave": 0, "distortion": 0 },
  "motionBlur": 1,
  "scenes": [
    { "style": "map-route", "route": ["İstanbul", "Kapadokya"], "duration": 6, "camera": "drift",
      "transition": { "type": "whip", "duration": 0.45, "dir": "left" } },
    { "clip": "beach.mp4", "in": 3.2, "duration": 2.5, "speed": "ramp-mid", "camera": "handheld",
      "overlay": { "style": "captions", "text": "Kaş, Antalya" },
      "transition": { "type": "burn", "duration": 0.8 } },
    { "image": "portrait.jpg", "look": { "type": "engrave", "reveal": 3 }, "duration": 4, "camera": "push-in" },
    { "style": "neon-sign", "text": "See you / soon", "duration": 3 }
  ],
  "overlays": [ { "style": "captions", "text": "…", "from": 0, "to": 5 } ]
}
  • 장면 유형: style (모든 스타일 ID + 해당 옵션), image (image 경로, 또는 2.5D 시차 효과를 위한 layers: [{src, depth}]), clip (clip, in, speed: 숫자 | ramp-in | ramp-out | ramp-mid), color.
  • 경로는 JSON 파일을 기준으로 합니다.
  • transition은 해당 장면이 끝날 때 적용됩니다. 다음 장면은 이 장면이 끝나기 duration초 전에 시작됩니다.
  • overlay = 해당 장면 위에 그려지는 스타일(카메라와 함께 움직임). overlays = 모든 것 위에 고정, 그레이드되지 않음.
  • 카메라: 프리셋 이름 또는 { "preset": "drift", "amount": 0.6, "shake": 0.5, "keys": [{ "at": 0, "zoom": 1 }, { "at": 1, "zoom": 1.3, "ease": "outExpo" }] }.

5. 카탈로그

카메라 — static, drift, push-in, pull-out, punch-in, crash-zoom, whip-from-left, whip-from-right, whip-from-top, spin-in, rise, orbit, tilt-reveal, tilt-left, tilt-right, vertigo, handheld, float, beat-punch. 카메라 움직임은 자동으로 모션 블러가 적용됩니다.

전환 — cut, fade, flash, dip, whip, zoom, spin, glitch, ink, burn, liquid, iris, wipe, blinds, pixelate, leak, cube, ripple, doors, stretch, luma.

룩 (이미지/클립) — engrave (잉크가 그려짐 → 해칭 → 세피아 워시), sketch, oldphoto, duotone, halftone, posterize, noir. 옵션: { "type": "engrave", "reveal": 3, "delay": 0.2, "paper": "#ece0c4", "ink": "#33210f" }.

그레이드 — none, teal-orange, kodak, fuji, sepia, noir, bleach, cyber, sunset, matte (+ gradeAmount 0–1).

스타일 — node engine/cli.mjs list 명령으로 실시간 목록을 확인하세요. 각 스타일의 옵션은 styles/<id>/style.js 상단에 문서화되어 있습니다 (defaults + options).

스타일설명주요 옵션
map-route지구본/평면 지도/터키 주 위의 경로 비행, 핀 + 라벨route, mode globe·flat·turkey·auto, theme dark·atlas·light, icon, highlight
history-title금박 연도 카운터 + 챕터 타이틀text "1453 / Title / Subtitle", from
parchment-letter불에 탄 양피지, 손글씨 + 깃펜 + 밀랍 인장place, signature, seal
murmuration찌르레기 떼가 단어로 접힘birds, 하늘 색상
led-marquee상점/미니버스 LED "kayan yazı" 보드줄당 하나의 보드, colors
receipt감열지 프린터가 메시지를 인쇄하고 찢어짐header, items, total, date
ink-bleed잉크 방울이 글자로 퍼짐ink, paper
halftone-press2색 등사 인쇄inkA, inkB, dot
signal-tune구형 TV: 스노우 → 테스트 카드 → 방송channel, station
inflateY2K 크롬 풍선 글자chrome, face
orbit-ring행성 주위의 텍스트 고리줄당 하나의 고리
beat-cut박자당 하나의 스탬프 단어, 스위스 포스터 스타일bpm, offset
lyric-video박자에 맞춰 단어별로 조명되는 가사bpm, times, credit
captions릴 캡션, 활성 단어가 알약 모양으로 강조 (--alpha 사용)times, maxWords, pill, position
split-flap출발 보드 플립 (터키식 드럼)title, cols
neon-sign벽돌 위 네온 튜브, 하나는 고장남colors, broken
odometer숫자까지 굴러가는 롤링 숫자text "10000 takipçi", prefix, suffix
pixel-quest8비트 타이틀 화면pixel, subtitle
vhs-memory홈 비디오 테이프 룩date, clock
운동 타이포그래피
word-stack양쪽 정렬 포스터 스택, 각 줄이 전체 너비로 박힘accent, beat, kicker
typewriter키별로 타이핑되며 깜박이는 커서theme paper·terminal, speed, prompt
scramble무작위 문자들이 텍스트로 디코딩font mono·display, resolve, hud
ticker-rows거대한 행이 교차 방향으로 스크롤rows, tilt, speed, accent
highlight-quote인용문이 페이드 인, 마커가 키워드를 훑음author, highlight (단어), marker
glitch-titleRGB 분할 + 데이터모시가 깨끗한 타이틀로 안착subtitle, colors, every
3D
extrude-3d통통한 돌출 글자가 스윙하며 회전face, side, bg, depth
cube-spin큐브가 면을 돌며 한 면당 한 줄colors, ink, floor
text-tunnel텍스트 고리를 통과하여 타이틀로 비행line 1 = 타이틀, rings, ring, colors
retro-grid신스웨이브 그리드, 줄무늬 태양, 크롬 타이틀line 1 크롬, 나머지 스크립트, sky, sun, speed
particle-sphere입자 구체가 단어로 변형count, morphAt, colors
card-carousel카드의 3D 링이 마지막 줄에 착지images (로컬 파일), turns, colors
소셜 및 방송
countdown3·2·1 링 스위프, 그 다음 텍스트from, tick, accent
lower-third뉴스/유튜브 이름 스트랩 (--alpha 사용)line 1 이름, line 2 역할, theme solid·glass·minimal, position
chat-story메시징 채팅, 타이핑 점한 줄당 하나의 메시지, > = 나, name, theme
bar-chart막대 차트 경주, 값이 올라감items: [["A",10],…], unit, note, source
cta-follow커서가 팔로우를 클릭, 체크 + 컨페티line 1 핸들, line 2 버튼, line 3 부제목, done

스타일 옵션은 --set key=value (JSON 값: --set 'route=["A","B"]') 또는 장면 객체의 키로 전달합니다.

6. 문제 해결

  • unknown place "X" (map-route): "lat,lon" 또는 { "name": "X", "lat": 0, "lon": 0 }을 사용하세요.
  • 카메라 움직임에 의해 텍스트 잘림: 카메라 amount를 낮추거나 drift/float를 사용하세요.
  • 느린 렌더링: 초안에는 --size 540을 사용하세요. 최고 품질이 필요하지 않다면 --motion-blur를 4 이상으로 설정하지 마세요.
  • 출력이 흰색/비어 있음: still을 실행하고 오류를 읽으세요. doctor가 WebGL2를 확인합니다.
  • Windows PowerShell / cmd가 --set 'route=["A","B"]'를 망가뜨림: 옵션을 파일에 쓰고 --params opts.json을 사용하거나 컴포지션 JSON을 사용하세요.
  • 터키어 이름(ı, ş…)을 포함하는 영어 텍스트는 자동으로 터키어 대소문자가 적용됩니다. 이를 중지하려면 --lang en을 전달하세요.

관련 스킬