用途
code-based films 旨在制作一段 15–30 秒的动画或电影短片,其核心约束是:画面中的每一帧都由自研代码绘制,而非使用第三方渲染器、DCC 软件、下载的模型、纹理、动作捕捉或库存素材。影片被视作一个程序:故事时间线给出每个角色、道具和灯光在时间 t 的状态,镜头文件定义相机,路径追踪器渲染帧,FFmpeg 完成组装。生成的图像(风格帧、转面图)仅作为对比目标,绝不会出现在画面中或被用作纹理。
主要能力
- 本地 GPU 路径追踪:engine/ 提供基于 WebGPU 计算(WGSL)的路径追踪器,在本地 GPU 的无头 Chrome 中运行,由 Node 通过 puppeteer-core 驱动。CLI 为 engine/bin/render.mjs,支持单帧和
--frames a-b序列渲染。 - 音乐分析与节拍图:tools/beatmap.py 分析音乐 BPM、强拍、小节、段落和 drop,生成电影定时所依据的小节图。
- 编码与后期:tools/encode.sh 使用 FFmpeg 编码帧序列,叠加标题并混合音频。
- 可选远程渲染:tools/rp、tools/rp_pool.mjs、tools/rp_pod/ 支持在 Runpod 的 RTX 4090 pod 池上进行远程渲染,仅用于加速,并非必需。
- 参考实现:仓库中包含示例项目 examples/felt-good-morning/,一个完整的 20 秒毛毡与纸张风格的儿童短片,可作为资产、故事函数、镜头或渲染任务的参考。
使用方式
首先运行 bash "$SKILL/setup.sh" 完成一次性环境检查(Node ≥ 22.12 和 Chrome),并将引擎的两个锁定 npm 包安装到 engine/node_modules。可选 Python 工具依赖通过 python3 -m pip install --require-hashes -r "$SKILL/requirements.txt" 安装。
新建影片即新建一个项目文件夹,保持与示例相同的结构。将引擎链接到项目中:ln -s "$SKILL/engine" "$PROJECT/engine",并在 shots/ 中使用相对导入 ../engine/src/scene.mjs,在 assets/<x>/ 中使用 ../../engine/src/geom.mjs。在仓库中,也可运行 bin/hve new <name> 将示例复制到 projects/<name>。
制作流水线按顺序分为多个阶段,每个阶段都有验收门槛:
- 故事:三条日志线中选一条,第一秒设钩子,扭转需利用世界材质(毛线、纸张、毛毡、雨、金属),并确定最终画面。须由负责人批准。
- 音乐与小节图:先生成或委托音乐,运行 tools/beatmap.py,读取小节、drop 和停顿,影片据此定时。
- 节拍表(BEATS.md):每个镜头一行,含时间、帧范围、画面、镜头、灯光、声音。大事件落在强拍上,drop 承载故事高潮。
- 风格帧与转面图:在 refs/ 中为每个镜头生成风格帧,为每个主角生成转面图,作为目标并须批准。
- 代码资产:与参考图并行构建,每个资产附带证明渲染和诚实的 GAPS.md。
- 动态分镜(animatic):在音乐下使用真实资产、真实相机、低 spp(32–64)、小分辨率(640×480)。须锁定剪辑。
- 注释与灯光/外观:确保故事无需文字即可读懂,每个剪辑有原因,时间命中节拍;每个镜头 2–3 张测试帧对照风格帧。
- 最终渲染:本地 GPU 以
--frames分块、可恢复方式进行;远程 GPU 可选。 - 后期与声音:自有辉光/调色、OFL 字体标题、事件合成音效、音乐混音。
- QA:机器逐帧检查,每个镜头人工抽检一帧,新眼评审,修复后交付。
- IP 检查与交付。
适用场景
- 制作短篇动画或电影短片(15–30 秒),要求画面完全由代码生成。
- 需要与音乐节拍严格同步的影片,尤其是强调节拍和 drop 的短片。
- 利用本地 GPU 进行路径追踪渲染,可接受分块、可恢复的渲染流程。
- 有明确制作管线与 QA 要求的团队项目,支持子代理分工。
限制
- 仅允许自有代码出现在画面中;禁止第三方渲染器、DCC 应用、下载的模型/纹理/动作捕捉/库存素材。Python/numpy 和 Node 可用,但包只能通过团队批准的依赖渠道安装。
- 生成图像只是目标,绝不渲染、投影或采样。
- 渲染默认在本地进行;笔记本电脑上需保持预览小尺寸(640×480,32–64 spp),限制每帧秒数(
--max-seconds),一次只运行一个渲染进程,最终渲染分块(--frames a-b)。 - 确定性要求:所有随机值来自带种子的 RNG,相同帧号必须产生相同场景,任何帧可单独重渲并与相邻帧一致。
- 一帧 = 一个纯函数:sceneFor(i) 不读取之前帧,模拟预烘焙为逐帧缓存并按帧索引读取。
- 单位:米,Y 轴向上,角色面向 +Z,脚在 y = 0。
- 灯光必须有形状:每个主角有主光和轮廓光,真实阴影和接触,禁止平光。
- 时间就是音乐:剪辑、打击和揭示落在小节图上,drop 是高潮。
- 无 IP 问题:自有角色、自有设计、自有或生成音乐、OFL 字体及许可证文件。
- 凭证只从环境变量读取,绝不写入项目、随附日志或文档。
- 使用租用 GPU 时需控制成本:仅为渲染创建 pod,记录台账,完成即删除并确认。
- 未经 QA 不得交付。
默认格式
1440×1080(4:3)或按简报,24 fps,15–30 秒,H.264 yuv420p CRF 16–18,AAC 48 kHz,响度约 −14 LUFS 积分,真峰值 ≤ −1 dBTP。动态分镜:640×480(或 720×540)@ 32–64 spp。最终渲染:1440×1080 @ 192–1024 spp,取决于噪点和降噪器。
更多参考
技能内提供多个参考文档,按当前步骤按需加载:references/production-map.md、light-standard.md、asset-contract.md、shots-and-timeline.md、rendering.md、qa.md、ip-clean-delivery.md、briefing-agents.md,以及 engine/README.md 和示例仓库。