/stick-figure:用火柴人製作卡通解釋影片
使用者提出一個想法或問題(「為什麼打哈欠會傳染?」、「為什麼貓會把桌上的東西推下去?」、「為什麼我們會拖延?」)。你以一句話寫出答案,佈置一個小場景來展示它,檢查幾個幀畫面,渲染影片,然後交出一個無聲的 MP4(5-7 秒)。
下方的 \${CLAUDE_SKILL_DIR} 是此技能的資料夾(即此 SKILL.md 所在的資料夾)。如果你的環境沒有自動填入,請使用該資料夾的路徑。將所有檔案儲存在使用者的當前資料夾,或他們指定的資料夾中。
0. 設定檢查
python3 "${CLAUDE_SKILL_DIR}/scripts/render.py" --check
這需要幾秒鐘;如果不確定此電腦是否已設定完成,請執行它。如果顯示 "ready": true,則表示可以繼續。否則,請執行它在 "fix" 下列出的命令,並告訴使用者這是一次性安裝:python3 -m pip install playwright(瀏覽器驅動程式)、python3 -m playwright install chromium(僅在未安裝 Google Chrome 或 Edge 時需要,約 150 MB)以及 python3 -m pip install imageio-ffmpeg(僅在缺少 ffmpeg 時需要)。如果 pip 拒絕並顯示「外部管理環境」,請建立一次私有環境,然後對所有命令使用其 Python:python3 -m venv ~/.animate-skills && ~/.animate-skills/bin/pip install playwright imageio-ffmpeg,然後在需要時執行 ~/.animate-skills/bin/python -m playwright install chromium。在 Windows 上,請使用 py 代替 python3。如果這裡無法使用瀏覽器(例如 Claude 應用程式的沙盒環境),請參閱此文件末尾。
1. 規劃場景(簡要)
- 標題:問題或想法,簡短(最多約 40 個字元)。
- 答案:一句話的解釋,真實且簡單(最多約 45 個字元)。它會在大約一秒後出現。
- 場景:1-4 個角色在 5-7 秒內以 3-8 個節拍演出答案。展示它發生的過程:打哈欠從一個人傳給另一個人、貓把杯子推下桌、狗醒來搖尾巴。最後一個節拍是重點,並停留在畫面上直到結束。
2. 撰寫規格
儲存 stick-<主題>.json。範例(examples/knock-things-off.json):
{
"title": "為什麼貓會把桌上的東西推下去?",
"answer": "狩獵本能,而且能吸引你的注意",
"scene": "room",
"props": [{"type": "table", "x": 0.62}, {"type": "cup", "x": 0.70, "on": "table", "wobbleAt": 1.6, "fallAt": 2.15},
{"type": "plant", "x": 0.08}],
"figures": [{"id": "cat", "kind": "cat", "x": 0.52, "on": "table", "head": "#F4A261", "hatColor": "#F4A261"},
{"id": "you", "x": 1.2, "label": "你", "hat": "hair", "hatColor": "#6B4423"}],
"beats": [
{"who": "cat", "do": "look", "at": 0.0, "for": 1.0, "to": 0.7},
{"who": "cat", "do": "swipe", "at": 1.0, "for": 1.2, "to": 0.7, "say": "Boop"},
{"who": "you", "do": "run", "at": 2.3, "for": 0.8, "to": 0.86},
{"who": "you", "do": "surprised", "at": 3.1, "for": 0.9, "say": "我的杯子!"},
{"who": "cat", "do": "sit", "at": 3.3, "for": 1.0},
{"who": "you", "do": "point", "at": 4.1, "for": 1.2, "to": "cat"},
{"who": "cat", "do": "love", "at": 4.4, "for": 1.0}
],
"arrows": [{"from": "cat", "to": "you", "at": 3.6, "for": 0.4}]
}
更多:examples/contagious-yawns.json(三個人)、examples/procrastination.json(辦公室,有人走進來)、examples/dog-wags.json(公園裡的狗和小孩)。
場景:street(天空、人行道、道路)、park(太陽、山丘、草地)、room、office(有城市景觀的窗戶)、classroom(加上 "board": "text" 來顯示黑板)、night(星星和月亮)、plain(加上 "background": "#hex")。
角色(x 從 0 = 左邊緣到 1 = 右邊緣;使用 -0.2 或 1.2 讓角色從畫面外走進來)。三個人可以舒適地放在一個垂直影片中(x 0.2、0.5、0.8);第四個人需要 scale 約 0.85 和約 0.22 的間距。側面的狗或貓大約佔畫面寬度的 0.35(x 是它的身體;鼻子大約在前方 0.2 處):讓寵物停在距離它跑向的人約 0.3 的位置。保持名字標籤簡短(「小明」,而不是「那個人」):
kind:person(預設)、cat、dog(側面,大約人的三分之一高度)。id、x、label(腳下的名字:「你」、「你的大腦」)、scale(兒童使用 0.6-0.8)、facing(left/right;否則他們會面向中間,然後面向他們最後移動、指向或揮舞的方向)。on:站在家具上:table、desk、bench、shelf、bed(將家具道具放在相同的 x 位置)。- 人物:
hat(cap、tophat、beanie、crown、bow、hair)、hatColor(也是頭髮顏色)、head(臉部顏色)、glasses(true)、tie(一種顏色)。寵物:head(毛色)、hatColor(耳朵顏色)。
節拍({"who", "do", "at", "for", "to", "say"},以秒為單位):to 是另一個角色的 ID 或 x 座標(0-1)。
do(人物) | 看起來像什麼 | do(人物) | 看起來像什麼 |
|---|---|---|---|
walk, run | 移動到 to | talk | 嘴巴動,一隻手做手勢 |
wave | 揮手,大大的笑容 | yawn | 舉起手臂,大哈欠,閉上眼睛 |
look | 將頭轉向 to | point | 指向 to(一個角色的頭,或某個 x 的桌子高度) |
think | 手托下巴(有 say:思考泡泡) | shrug | 「誰知道呢?」 |
jump | 高興地跳起來 | cheer | 雙手舉成 V 形 |
surprised | 向後跳,「!」 | sad | 低下頭,一滴眼淚 |
sleep | 閉著眼睛,Zzz | laugh | 跳動,大大的笑容 |
dance | 跳舞,音符 | idea | 舉起手臂,燈泡 |
love | 愛心 | fall | 摔倒並保持倒下 |
raise | 舉起一隻手(投票、提問、「選我!」) | write | 在書桌前寫字或簽名 |
relabel | 更改名牌:{"who": "小明", "do": "relabel", "at": 4, "text": "法律"} |
寵物:walk、run、jump、sit、swipe(朝 to 方向用爪子揮,用於推倒東西)、sleep(蜷縮,Zzz)、meow/bark/talk(張開嘴;加上 say)、surprised(弓起背,「!」)、look(轉向面對 to)、wag(開心,搖尾巴)、love、idea、sad。
say 會在該節拍中於角色上方放置一個對話泡泡(最多 5 個詞;think 會產生思考泡泡;泡泡會取代該節拍的小圖示;泡泡會避開其他人的臉)。每個角色的最後一個節拍會將其姿勢保持到結束(走路、跑步、說話和打哈欠除外),而場景中最後說出的台詞也會保留下來,所以請在重點處結束。point 指向遠處角色的頭部和近處角色的胸部。
道具({"type", "x", ...}):家具和場景佈景 bus-stop、tree、bench、desk(附筆記型電腦)、table、door、sign(附 text)、car("drive": 1 使其開過)、house、plant、lamp、tv、bed;以及小物件 cup、mug、glass、vase、bottle、plate、ball、book、phone、box、paper(文件)。小物件放在地板上或 "on": "table"(或 desk、bench、shelf、bed;將它們的 x 設定在該家具寬度內,大約在其 x 的 ±0.15 範圍內);"wobbleAt": s 使其搖晃,"fallAt": s 將其推倒("fallDir": -1 向左);杯子、玻璃杯、花瓶、瓶子和盤子會碎裂並發出 CRASH 聲("sound": "SMASH!" 可更改文字),球會彈開。還有 color、scale、front: true(繪製在角色前方)。
箭頭({"from", "to", "at", "for", "color", "hold"}):從一個頭部到另一個頭部的虛線箭頭,類似「傳遞下去」;hold 是繪製後停留的時間(預設 0.9 秒)。
其他欄位:answer 會自動換行(每行約 24 個字元);如果希望在特定位置換行,請放入 |。answerAt(秒;預設約 1.1)、size("1080x1920" 為預設、"1080x1080"、"1920x1080")、duration(預設:最後一個節拍結束時間 + 1.3 秒,至少 5 秒)、fps(預設 30)。
舞台提示:從 0.0 開始一個節拍,這樣一開始就沒有角色是靜止的;讓節拍稍微重疊,這樣總是有東西在移動;每個節拍 0.8-1.6 秒;將推倒或關鍵時刻放在中間,反應放在之後。
3. 檢查三個幀
python3 "${CLAUDE_SKILL_DIR}/scripts/render.py" stick-<主題>.json --still 0.5 --out stick-<主題>-check1.png
python3 "${CLAUDE_SKILL_DIR}/scripts/render.py" stick-<主題>.json --still 2.5 --out stick-<主題>-check2.png
python3 "${CLAUDE_SKILL_DIR}/scripts/render.py" stick-<主題>.json --still end --out stick-<主題>-check3.png
--still 接受秒數或 end;也檢查關鍵時刻(推倒、揭露)的時間。查看它們:角色是否在畫面上並面向正確的方向,沒有人穿越另一個人,泡泡沒有遮住臉或標題,故事在沒有聲音的情況下可讀。如果不符合要求,請調整位置或時間並重新檢查。
4. 渲染影片
python3 "${CLAUDE_SKILL_DIR}/scripts/render.py" stick-<主題>.json --out stick-<主題>.mp4
大約需要 10-25 秒。刪除檢查圖片。
5. 交付
將 MP4 的路徑告知使用者(如果你的環境可以顯示檔案,請展示它)。它沒有聲音,可以隨時加入音樂或旁白。提供一個變化版本(另一個結局、另一個場景)。
沒有瀏覽器?(例如 Claude 應用程式的沙盒環境)
如果設定檢查無法讓瀏覽器運行,請改為將動畫寫成一個頁面:python3 "${CLAUDE_SKILL_DIR}/scripts/render.py" stick-<主題>.json --html stick-<主題>.html。該頁面可在任何瀏覽器中播放(如果可以,請將其顯示為 artifact)。告訴使用者,MP4 需要在電腦上使用 Claude Code,或對頁面進行螢幕錄製。