卡通3D故事短片(three.js + Remotion)
命令从项目根目录运行,使用 Bash(而不是 PowerShell)。references/ 和 templates/ 相对于此技能;SK = .claude/skills/cartoon-3d-short。
已完成的短片位于 src/videos/ 中,切勿编辑。不要通过阅读它们来学习代码:references/API.md 是地图。
references/STYLE_BIBLE.md 和 references/reports/ 是来自其他渠道的学习材料。切勿复制该渠道的脚本、角色或镜头,切勿在旁白或描述中提及该渠道名称。
规则
- 无字幕或标签。仅限英语。保持一致的语音语调。笑话必须是经过研究的事实。
- 每个镜头都必须用建筑物、树(树干间隙有2-3米灌木丛)或远处的山丘来隐藏地平线。只填充摄像机看到的内容。场景要丰富:拥挤的人群、装饰品、纹理、旗帜。
- 最终导出为 1080x1920,30帧/秒,切勿使用
--scale。 - 混音:旁白、低于旁白约6dB的免费CC0音效、在旁白下方回避的场景音乐提示(切不可使用单一连续音轨),整体混音为 -15 LUFS。
- 免费、无版权的SFX和3D模型的一般审批:检查文件页面上的许可证,跳过署名/非商业/相同方式共享,在
_sfx/LICENSES.md中记录,说明获取的内容和大小。在询问登录、付款、其他下载或运行未安装的软件包之前,请先询问用户。 - 定稿检查清单(
references/QA.md):在第一套完整定稿上使用 Opus-medium 代理,并在渲染前再使用一次;期间自行重新检查;然后用户批准定稿。绝对分数不是关口。 - 修复仅重新渲染更改的块(
--redo),切勿重新渲染整个视频。 - 每个步骤后保存。为用户设置两个暂停点:脚本审批,以及最终渲染前的最终定稿审批。否则,无需询问即可继续工作直到交付。
流水线
- 主题和事实。 一个有视觉、物理因果关系的令人惊讶的真实故事,加上一个日常类比。带有来源的事实放在
src/videos/<name>/SCRIPT.md的顶部。 - 脚本。 长度遵循故事发展。字数 = 秒数 x 字/秒,根据所选语音的一个句子样本测量(无样本:假设为3字/秒,并在录制后检查)。节拍:钩子(一个荒诞的事实,一行),背景设定(年份,地点,骄傲),动作(3-4个逐步升级的节拍),转折,面无表情的评论(“幸运的是... / 不幸的是...”),解释(一个想法,日常类比),后果,回调转折。永远不要描述观众已经看到的内容。仅限布局:
templates/SCRIPT_example.md。在此处停止,直到用户批准脚本。 - 语音。 用户将录音生成到
_voiceover/<name>/voice_raw.wav。然后运行python scripts/voice_trim.py _voiceover/<name>/voice_raw.wav _voiceover/<name>/voice.wav和python scripts/words_whisper.py _voiceover/<name>/voice.wav _voiceover/<name>/words.json。所有内容都根据words.json计时:切勿直接阅读它,而是将其打印为word@frame,并使用一个简短脚本修复错误的单词。根据kept pauses行进行操作(references/GOTCHAS.md“语音”部分)。 - 视频文件夹。 将
templates/starter/中的四个文件复制到src/videos/<name>/,将Short.tsx重命名为<Name>.tsx,并重命名其中的StarterShort/STARTER_FRAMES,在src/Root.tsx中注册该合成。它们只包含故事数据加上一个标记为EXAMPLE的2镜头演示;引擎在src/shared/中。在编辑前阅读references/API.md。如果src/shared/或scripts/缺失或缺少文件,请从templates/shared/或templates/scripts/复制。 - 道具扫描。 对于每个节拍,grep
public/kenney/INDEX.txt并将选取的道具表记录在src/videos/<name>/PROPS.md中。缺少道具:获取一个免费的CC0包(references/GOTCHAS.md)到public/kenney/<pack>/,追加到INDEX.txt,将<pack>/<model>添加到world.ts的KENNEY中。 - 在
story.ts中的镜头规划:TOTAL= ceil(语音秒数 x 30),然后是SHOTS、XFADE、FLASH_AT、CAMS、KICKS、DOF_V2。视觉反应应当在其对应的单词之前0-3帧出现。每个停顿镜头都有微妙的移动。每个循环运动都有明确的切换时间。 - 通过替换
EXAMPLE部分来构建镜头。 房屋外观已内置在引擎中(references/LOOK.md);切勿为了单个视频而编辑src/shared/。- 世界(
world.ts):场景、道具、材质、pose()中的移动道具。天空、灯光、城镇、港口、太阳和视距剔除来自引擎。对于主要道具,在prop()中传递keep = true。 - 角色(
cast.ts):服装和每个舞台化的一个stage()案例。卡片、轮廓、眨眼和阴影来自引擎。 - 合成(
<Name>.tsx):名称和poolShots仅此而已。后期处理链(墨迹、镜头模糊、辉光、色调映射、调色)在引擎中。
- 世界(
- 定稿检查,在任何长时间渲染之前(
references/QA.md):每个镜头中间帧的定稿,脚本检查,代理检查,修复和自检,第二次代理检查,修复和自检。在此处停止,直到用户批准定稿。 - 音效准备(
references/SOUND.md):_sfx/<name>_events.json中的SFX事件,_sfx/<name>_music_cues.json中的音乐提示。 - 最终渲染(
references/RENDER.md):REMOTION_TMP=C:/remotion-tmp node scripts/render_chunks.mjs <Comp> out/<name>/video.mp4 <TOTAL>。 - 混音和QA。 组装音乐(
music_cues.py,参见references/SOUND.md),然后运行python SK/templates/audio/build_mix.py _voiceover/<name>/voice.wav out/<name>/video.mp4 out/<name> _sfx/<name>_events.json [_sfx/<name>_music.wav]写入video_final.mp4。然后运行python scripts/bridge_shots.py src/videos/<name>/story.ts out/<name>/shots.json和python scripts/short_qa.py out/<name>/video_final.mp4 out/<name>/qa out/<name>/shots.json --voice _voiceover/<name>/voice.wav,必须退出码为0。使用render_chunks.mjs ... --redo A-B,C-D修复,然后再次混音和QA。用户对最终视频的备注:references/QA.md“用户审查”部分。 - 交付。 发送
video_final.mp4(超过30 MB:提供一个较小的预览版加上路径),删除C:/remotion-tmp中此短片的包文件夹,更新记忆。
参考文件
| 文件 | 何时阅读 |
|---|---|
references/QA.md | 定稿检查、检查清单提示、short_qa |
references/SOUND.md | SFX库、音乐提示、混音 |
references/RENDER.md | 渲染设置、补丁循环、恢复 |
references/API.md | 在编辑起始文件之前:什么放哪里、函数签名 |
references/GOTCHAS.md | 语音、道具和场景、取景陷阱、此PC |
references/LOOK.md | 房屋外观值、相机和角色规则 |
references/LOOK_MATCH.md | 仅用于原始参考外观或外观匹配传递 |
references/house/GRADER_PROMPT.md | 成对A/B比较,仅在更改外观时使用 |
更改技能本身(文档、起始文件、引擎、脚本):首先阅读 MAINTAINING.md。