Communitygithub.com

Rudywizz/rudywizz-motion

從程式碼製作電影級動態圖形影片——動態排版、3D 標題、地圖路線動畫(世界、地球、土耳其省份)、社交模板(下三分之一、字幕、聊天故事、倒數、長條圖競賽、追蹤行動呼籲)、復古歷史文件(將圖片繪製成蝕刻版畫),以及完整的影像短片(含鏡頭移動、著色器轉場、調色與底片效果)。

rudywizz-motion 是什麼?

rudywizz-motion 是一個確定性渲染引擎,結合 headless Chromium 與 WebGL2 計算每一幀,再透過 ffmpeg 輸出影片,確保相同輸入產生相同輸出。此技能支援多種動態圖形類型:從動態排版、3D 標題、地球/平面/土耳其省份路線動畫,到社交媒體模板(下三分之一、字幕、聊天故事、倒數、長條圖競賽、追蹤 CTA),以及復古文件效果(將圖片轉為蝕刻版畫)和完整影像短片(含手持鏡頭、轉場、調色與底片顆粒)。工作流程強調先以 `still` 預覽低解析度畫面,再進行最終渲染,並提供 `doctor` 指令檢查環境是否就緒。支援透過組合 JSON 定義多場景、轉場、疊加層與進階攝影機動態,適合 Claude Code、Cursor、Codex 等 AI 代理開發影音內容。

相容平台✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/Rudywizz/rudywizz-motion/tree/HEAD/skills/rudywizz-motion

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

rudywizz-motion 是做什麼的?

一個確定性渲染器:每一幀都由 headless 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 ✓ browser ✓ 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 預覽,最終輸出再使用 1080。
  • 未經使用者許可切勿從網路下載圖片/片段;請使用他們的檔案。
  • 透明疊加層:--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 路徑,或 layers: [{src, depth}] 實現 2.5D 視差)、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 / 標題 / 副標題", from
parchment-letter燒焦羊皮紙、手寫文字 + 羽毛筆 + 蠟封place, signature, seal
murmuration椋鳥群演變成文字birds, 天空顏色
led-marquee商店 / 小巴 LED "kayan yazı" 跑馬燈每行一個面板, colors
receipt熱感印表機列印訊息並撕下header, items, total, date
ink-bleed墨水滴擴散成字母ink, paper
halftone-press雙色孔版印刷inkA, inkB, dot
signal-tune老電視:雪花 → 測試圖 → 開播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穿越文字環直達標題第 1 行 = 標題, rings, ring, colors
retro-grid合成波網格、條紋太陽、鍍鉻標題第 1 行鍍鉻,其餘手寫體, sky, sun, speed
particle-sphere粒子球體變形成文字count, morphAt, colors
card-carousel3D 卡片環,最終停在最後一行images (本地檔案), turns, colors
社交與廣播
countdown3·2·1 搭配圓環掃描,然後顯示文字from, tick, accent
lower-third新聞 / YouTube 名稱條(搭配 --alpha)第 1 行姓名,第 2 行職稱, theme solid·glass·minimal, position
chat-story訊息聊天搭配打字點點每行一則訊息, > = 我, name, theme
bar-chart長條圖競賽,數值遞增items: [["A",10],…], unit, note, source
cta-follow游標點擊「追蹤」,勾選 + 五彩紙屑第 1 行帳號,第 2 行按鈕,第 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 以停止此行為。

相關技能