3D 卡通动画
版本 1.0.1(公开版)· 方法和外观已由所有者在第一轮(“引力是如何发现的”,v3,2026年10月26日)批准。1.0.1 使工具可在任何计算机上运行;影片渲染结果与 1.0.0 完全相同。
“所有者” 在这些文件中是指影片为其制作的人:即要求制作影片并批准它的人。
故事板优先(所有者的规则,2026年10月27日)。每部影片及每个新版本,都从所有者框架中的故事板开始。在所有者批准之前(技能 4),不进行配音、详细构建或渲染。
此软件包是一个完整的、可复用的方式,用于制作一种特定类型的视频:简短、快速、温暖的 3D 卡通解说片。它适用于任何主题。工作示例是关于引力的,但方法本身不依赖于此:技能说明了如何找到切入点、分配角色、构建场景、将每个数字转化为对象、为每个手势匹配语音时间、设计音效并检查每一帧,无论下一个主题是什么。
完成视频的形态
- 格式: 1080×1920,30 fps,30–60 秒。一个解说从句 = 一个镜头(大约每 1.1–1.5 秒一个新画面)。最后一行循环回到第一帧。
- 故事: 开头 2 秒内提出一个问题的切入点;早期回报;向“你”讲述的利害关系;升级;在三分之二处重新设钩;以一个字面画面呈现的转折;循环结尾。
- 外观: 柔和的卡通着色、墨水轮廓、温暖的实景灯光、边缘光、景深、光晕和颗粒感。肤色面部;服装、道具和场景上使用品牌色(暗红、珊瑚蓝、干邑色、白砂、灰墨)。真实物体看起来真实(地球是蓝色和绿色的)。
- 角色: 球形头部、豆形身体、棍状四肢、连指手套手;绘画面部,无口型同步;面部在重音词前通过眨眼切换;静态姿势完全静止。
- 摄像机: 始终运动,在动作间缓慢移动,在每个句子的第一个单词处加速进入 6 帧溶解过渡。
- 事实即对象: 每个说出的数字在其出现的帧上成为一个计数器、日历、卷尺、仪表或发光标志。
- 文字: 开头 2-3 秒顶部显示主题问题(“引力是如何发现的?”),以及在 70% 高度处的编辑标题锁定(
一切在 你知道 之上)。 - 音效: 语音(ElevenLabs),低于语音 18 LU 的原创音乐音轨,每个可见动作都有安静的拟音音效,每个故事节拍都有重音,总响度母带至 −14 LUFS。
工作流程(每一步都是一个技能)
| # | 步骤 | 技能 | 输出 |
|---|---|---|---|
| 1 | 将主题转化为电影创意 | 主题转电影 | 角度、切入点、角色、场景、数字列表、全景图 |
| 2 | 撰写脚本 | 脚本与留存 | 带来源的 script.md |
| 3 | 录制语音并为每个单词计时 | 配音与计时 | vo/voice-final.wav, vo/words-final.json |
| 4 | 为每个镜头绘制故事板;所有者批准 | 故事板与镜头计划 | storyboard.md、故事板静态图、所有者的看板(storyboard/<v>/<Title> - storyboard <n>.png 和 .html) |
| 5 | 设置外观 | 外观、灯光与品牌 | 灯光预设、调色板、每个镜头的镜头设置 |
| 6 | 构建角色阵容 | 角色与面部 | 绑定、服装、面部切换 |
| 7 | 表演每个从句 | 运动与表演 | 姿势关键帧、搞笑动作、物理效果 |
| 8 | 移动摄像机 | 摄像机与过渡 | 每个镜头一个轨道运动 |
| 9 | 让数字实体化 | 事实即对象 | 每个数字一个设备 |
| 10 | 构建并装饰场景 | 布景与道具 | 使用套件构建并装饰的场景 |
| 11 | 编写屏幕文字 | 字幕与标题钩 | 标题锁定、主题问题 |
| 12 | 设计音效 | 音效设计与混音 | 提示列表、混音、分轨 |
| 13 | 渲染并检查每一帧 | 渲染与质量检查 | MP4 文件、QA 记录 |
| 14 | 与所有者一起审核并学习 | 审核轮次与学习 | 反馈、下一版本、软件包更新 |
按此顺序执行步骤。步骤 4-11 都在每部影片的一个文件(film.mjs)内完成,因此实际操作中你先规划故事板,然后逐个镜头构建,边构建边渲染静态图。
不可妥协的原则
- 故事板优先。 在录制语音、详细构建镜头或渲染任何内容之前,所有者必须批准故事板(技能 4)。
- 复制技术,绝不复制内容。 每个角色、场景、标志、笑话和发明的品牌名称都是我们自己的。真实历史人物被绘制成我们自己的卡通角色;绝不绘制受版权保护的角色。
- 钩子优先。 开头 2 秒必须提出一个问题;标题问题命名主题。
- 每个数字变成一个对象,在其说出的单词处出现。绝不要纯文字覆盖。
- 手势在其单词前 4 帧落地;面部在其前 2 帧通过眨眼切换。
- 每个可见动作都有音效;无动作则无音效。
- 每一帧都被检查(自动构图检查和跳帧扫描,然后肉眼检查),然后才呈现给所有者。
- 事实必须有来源。 当来源不一致时,用平实的语言进行模糊化处理。
- 所有者的品牌: 肤色面部、五种品牌色加品牌红色,以及包含的字体:字幕使用 TeX Gyre Heros Bold + Instrument Serif Italic,标签使用 Titan One(如果所有者添加,可使用授权字体 Helvetica Bold + Editorial New Italic;说明所用字体)。全部在 brand/ 中。
新主题的快速启动
- 复制
templates/new-film/到examples/<topic-slug>/。 - 填写 新主题工作表(技能 1)并将脚本(技能 2)写入
film.mjs中的SCRIPT。 - 使用草稿计时构建镜头并渲染故事板静态图:
node recipe/tools/render.mjs examples/<slug>/film.mjs <outDir> --stills shots --qa - 故事板优先。
- 复制
templates/storyboard.json到examples/<slug>/storyboard/v1/storyboard-1.json,为每个镜头包含一个面板及其静态图。 - 绘制看板:
node recipe/tools/storyboard-board.mjs examples/<slug>/storyboard/v1/storyboard-1.json。 - 将看板交给所有者,并修改它(
storyboard-2,……)直到所有者批准。 - 然后录制语音:
ELEVENLABS_API_KEY=… node recipe/tools/voiceover.mjs examples/<slug>(在写入vo/text.txt之后)。
- 复制
- 根据实际单词重新计时(自动),渲染视频,然后是音效:
node recipe/tools/render.mjs examples/<slug>/film.mjs <out> --video --name silent.mp4python -I recipe/tools/sound.py examples/<slug> <out>/silent.mp4 <out>/shots.json "<out>/<Title>.mp4" - 检查:构图报告,
node recipe/tools/jump-scan.mjs <video> <out>/shots.json,python -I recipe/tools/sfx-levels.py <out> <out>/cue-sheet.txt,然后肉眼检查每一帧(技能 13)。
文件位置
| 路径 | 内容 |
|---|---|
skills/ | 14 个步骤技能 |
recipe/engine/ | 渲染器:core.mjs(外观、后期、字幕、合成、检查)、faces.mjs、character.mjs、props.mjs、props2.mjs、kit.mjs(主题中立的场景和灯光预设)、places.mjs / places2.mjs(示例的装饰场景)、index.html、vendor/three(three.js r186,MIT 许可)、fonts/ |
recipe/tools/ | storyboard-board.mjs(所有者的故事板看板,作为 PNG 和可点击的 HTML 页面)、render.mjs、voiceover.mjs、sound.py、jump-scan.mjs、sfx-levels.py、paths.mjs(FFmpeg、Chrome 和 Playwright 的查找路径) |
templates/ | new-film/film.mjs(一个主题中立的启动器,基于草稿计时运行)和工作表 |
examples/how-gravity-was-found/ | 已批准的影片:源文件、语音、最终视频、故事板、提示表、分轨、早期版本 |
references/ | 参考研究、所有者的指示、引擎 API、故障目录、反馈历史、引擎说明 |
brand/ | 已批准影片的颜色和字体:palette.json、palette.css、style-sheet.png(由 recipe/tools/style-sheet.mjs 绘制) |
evaluation/ | 交付清单、验收标准、已知限制 |
preview/ | style-card.json:风格的名称、外观和格式在一张卡片中,指向示例的海报、影片和故事板 |
在新机器上设置
工具需要:
- Node 22+;
- 带有 ffprobe 的 FFmpeg 6+,并位于 PATH 环境变量中;
- 带有 NumPy 的 Python 3.10+;
- Chrome 可用于 WebGL2 的显卡。
在软件包文件夹中,运行 npm install、npx playwright install chromium 和 pip install -r requirements.txt;README 中有完整步骤。如果 FFmpeg 在其他位置,请设置 CARTOON_FFMPEG 环境变量。要使用其他 Chrome 浏览器,请设置 CARTOON_CHROME 环境变量(参见 recipe/tools/paths.mjs)。
影片必须位于软件包文件夹内(examples/<slug>/),因为渲染器会将软件包提供给浏览器。语音需要具有文本转语音权限的 ElevenLabs API 密钥,通过 ELEVENLABS_API_KEY 环境变量传递给命令,切勿写入文件。