纸艺动画故事板
故事板是构建每个场景的蓝图。它指定了每个场景的摄像机运动与剪辑方式,避免场景智能体自行发明。如果简报中写的是“CameraPush 或你自己定义的变换”,则每个场景都会得到一个简陋的推镜头或自制的缩放效果,而工具包中的摄像机运动将不会被使用。
预检
- 安装:最低配置即可。如果有库,请检查
style/$MOTION_STYLE/remotion/CATALOG.md(“paper/camera.tsx”和“paper/transitions.tsx”章节),查看每个运动所需的属性及其适用场景。如果文件缺失或已过时,请运行python3 $MOTION_LIB/core/tools/catalog.py。从环境变量中解析$MOTION_LIB,否则从~/.config/motion-explainer/config.env中的MOTION_LIB=行获取,若仍未找到则询问用户。 - 需要
narration/script.json和包含 HOOK 块及舞台表(每一行包括横幅、场景、道具、UI 时刻、吉祥物、笑点)的video/STORYBOARD.md。如果缺失,请运行motion-hook和motion-script。 - 背景幕布用于选择场景:
style/$MOTION_STYLE/remotion/public/bg/backdrops/_sheet.jpg。仅打开当前步骤所需的内容。
1. 全局规则
将以下内容放在 STORYBOARD.md 顶部,位于 HOOK 块下方。按角色分配调色板(每个场景轮换背景颜色):请参考 $MOTION_LIB/style/$MOTION_STYLE/docs/style-guide.md 第 5 节。字体:第 6 节。画布与区域:第 4 节。适合单一扩展隐喻的功能解锁可使用第 12 节。
- 1080x1920,30 fps。横幅位于 14-21% 高度,字幕区域 68-80%(根据场景上下移动以避免遮挡脸部),底部 20% 留空。
- 光源来自左上角。仅角色、字幕和信号使用高饱和度。
2. 摄像机/剪辑表
每行对应一个场景,位于场景分镜块之前。每一行指定了来自工具包 paper/camera.tsx 的一个摄像机组件,以及用于切入该场景的 CutSeries 类型(来自 paper/transitions.tsx)。
| 场景 | 摄像机 (paper/camera.tsx) | 切入 (CutSeries 类型) |
|---|---|---|
| S01Hook | OrbitCamera + Depth,在 <词> 上 SnapZoom | 无 |
| S04Name | Crane 上升至 <焦点道具> | tearAway |
| S09Peak | CrabTrack 沿 <队列> 移动 | whip |
| S10CTA | RackFocus 从 <道具> 转移到手机 | tapePull |
- 摄像机选项:
OrbitCamera+Depth,SnapZoom,Crane,CrabTrack,DollyZoom,RackFocus,ForegroundPass,DutchTilt,FocusPulse,FreezeFrame,PullBack,PovMask,TimeRamp,TiltShift,FocusHunt,Handheld和CameraPush(来自paper/kit.tsx)。目录中的paper/camera.tsx章节说明了各自适用场景。 - 剪辑选项:
hard,whip,zoomThrough,pageTurn,tearAway,tapePull,stampCut,infiniteZoom,popUpBook,keyhole,burnAway。 - 普通
CameraPush最多允许出现在三分之一的场景中。 - 将每行的摄像机复制到其场景分镜块标题中。剪辑列将写入
episode.json,格式为"cuts": {"S04Name": {"kind": "tearAway"}}(无条目表示硬切),由motion-build填充。
3. 场景分镜块
每个场景一个分镜块,时长 1.5-5 秒,在句子边界处剪辑:
## S03: <节拍> (5.6-8.2 s,78 f) 横幅:<大写要点>
位置/背景:<世界位置 + 背景颜色> 摄像机:<camera.tsx 组件 + 参数,来自表格> 切入:<类型>
演员:<角色,配饰> 字幕区域:y=0.76
| 口播词 (重读) | 帧数 | 事件 | 运动规格 |
| "<词>" | +6 | <道具进入 / 状态切换 / 动作> | <弹簧/滑动/交换 + 帧数> |
环境:<LED 闪烁,空闲摆动,星星,屏幕波形>
抖动:横幅 + 标签,每 2 帧 +/-1.5 像素
音效:<弹出声,叮铃声,点击声...>
- 将舞台表中的每一行展开为帧级事件:每个重读单词一个事件(每 0.4-0.8 秒),环境运动始终存在。帧数是相对于单词的偏移量,稍后通过
cueOf(ID)(word, n)读取。 - 产品 UI 是在纸制监视器或笔记本电脑上的粗略重建,带有虚假交互(光标点击,打字,进度条,波形,列表滚动)。
- 证明: 每个一段影片中,使用源页面的真实截图(通过
$MOTION_LIB/core/tools/capture.mjs从浏览器捕获,非重绘)粘贴在纸卡上,并用红色记号笔在关键行周围绘制圆形高亮。其余部分保持为粗略的纸艺重建。 - 在号召性用语之前,有一次对之前场景的回调。
4. 摄像机与转场规则
- 每个场景有一个运动。缓慢推进是基线。在灯光布景上添加视差轨道以增加深度,在重读单词上为数字和笑点添加推进或快照缩放,前景通过(模糊的纸制物体从镜头前经过)或焦点转移,拉远以显示规模,以及在挣扎吉祥物节拍上添加带有标签的定格帧。
- 主要使用硬切配合横幅变化。在 2-3 次主题变化时使用带运动模糊的甩镜头,在“进入”屏幕、门或镜子时使用缩放穿过,每个一段影片最多一个翻页或撕裂(用于转折或前后对比),以及进入号召性用语时的胶带拉伸(一条普通的牛皮纸条,可选
label打印一个词)。 - 钩子的切出应携带运动连续性。将来自
motion-hook的规则应用于 S01 和 S02。 - 转场持续 6-12 帧,每个转场带有其音效(甩动声,缩放声,翻页声,撕裂声,胶带剥离声)。
- 在项目库中,使用工具包的转场系列串联场景,确保每个场景起始于其
plan.json的帧,从而保持语音同步。
5. 音效计划
- 空气音效(嗖嗖声,滑动声,甩动声,缩放声)合计:每 2.5 秒一段影片最多一个。
cues.py会在超出此限时打印注释。例如,33 秒内有 12 个音效是可以的,但 26 秒内 24 个则显得杂乱。 - 入场使用接触音效(弹出声,撞击声,盖章声)或静音。在音频渲染前,将其计入
tools/cues.json。 - 在每个音效行的
SFX:中,从$MOTION_LIB/core/audio/CATALOG.md命名音效。场景智能体将实际行写入tools/cue_sheet.d/<Scene>.json。 - 选择背景音乐预设(
episode.json中的 "bed")并设置cutSfx以匹配剪辑类型:tearAway对应撕裂声,tapePull对应胶带剥离声。
检查清单
-
每个场景都有摄像机和切入方式,且普通
CameraPush最多用于三分之一的场景。 -
每个重读单词都有一个事件;环境运动已列出。
-
包含一个证明节拍、一次回调,以及导向号召性用语的胶带拉伸或甩镜头。
-
最多一个翻页或撕裂;空气音效在预算范围内。
-
在每个场景分镜块的事件表中,注明预期和最夸张的一个节拍。12 项动画原则及其到工具包组件的映射,请参考
$MOTION_LIB/style/$MOTION_STYLE/docs/motion-principles.md。
交接
下一步是 motion-build,它将搭建项目脚手架,并将摄像机/剪辑表和场景边界转换为 episode.json。它会读取 STORYBOARD.md 和 narration/script.json。STORYBOARD.md 中的“时间”部分将在语音录制完成后生成,因此此处请留空。