/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拒绝并提示“externally managed environment”,请创建一个私有环境,并将其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秒后出现。
- 场景: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。
名称标签保持简短(“Bill”,而不是“The bill”):
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": "bill", "do": "relabel", "at": 4, "text": "Law"} |
宠物:walk、run、jump、sit、swipe(用爪子向to方向挥击,用于推倒东西)、sleep(蜷缩,Zzz)、meow/bark/talk(张嘴;可添加say)、surprised(弓背,显示“!”)、look(转向to方向)、wag(高兴,摇尾巴)、love、idea、sad。
say会在该节拍期间在该角色上方显示一个对话气泡(最多5个单词;think会显示思考气泡;气泡会替代该节拍的小图标;气泡会避开其他角色的脸部)。每个角色的最后一个节拍会保持其姿势直到视频结束(walk、run、talk和yawn除外),并且场景中最后一句对白也会持续显示,因此要以点睛之笔收尾。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个字符);可在answer中使用|指定换行位置。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生成,或者通过屏幕录制该页面获得。