运动法则(网关)
在编排任何动画之前阅读此文档。它决定了在每个接缝处发生什么以及每个场景如何表演;技术技能实现它。这些规则优先于通用/上游运动指导。此规则防止的失败:孤立创作的场景——眼睛的动量在每个剪辑处消亡,并且场景在入口和出口之间原地摆动。
路线图
| 决策(本技能) | 实现技能 |
|---|---|
| 无缝过渡选择 + 参数 + 代码 | cut-the-curve §1–5(目录) |
| 文本/元素入场级联 | cut-the-curve §6(瀑布入场) |
| 场景内组重新定位(无剪辑) | cut-the-curve §7(微调曲线) |
| 光标引导动作/场景启动/变形点火 | oversized-cursor |
| 无缝渲染机制/白色闪光防护 | seam-craft |
| 产品发布/解释器/字幕工作 | 在上级技能之上叠加 text-beat-economics、brand-faithful、captions-overlay |
创作顺序:向量台账(ledger.json)→ 从台账标注主接缝(scripts/seam-stamp.mjs --ledger ledger.json --write index.html)→ 每阶段的持续运动路线 → 载体和原因 → 构建构图 → 验证(scripts/seam-gate.mjs)。
仅手动创作 Tier-A 变形/匹配剪辑;标注接缝通过构建通过验证。
第一部分 — 接缝法则
向量法则
场景 A 如何退场决定了场景 B 如何入场:相同轴、相同方向、匹配速度、两侧均在运动中剪辑。
- 轴 — x 保持 x,y 保持 y,Z 保持 Z。绝不要在剪辑时切换轴。
- 方向 — 绝不要镜像。对于 Z,方向 = 缩放变化的正负号:变大 = 推(摄像机向前),变小 = 拉(摄像机向后)。后退退场后跟从小变大的入场是一种镜像向量——最常见的违反,因为从小变大是默认的元素入场方式。
- 速度 — 入场初始速度 ≈ 退场最终速度,通过镜像缓动实现(退场
power4.in+ 入场power4.out,相同距离和持续时间;入场方的速度达到概念路径的 ≥50%)。机制详见cut-the-curve。 - 相位 — 剪辑落在两侧的运动中。在剪辑前静止下来,或在剪辑后从静止开始,都是死板拍子。
流动
每部影片选择一个主导方向(默认:向左)。每个普通接缝使用它。其他向量是保留的——使用其中一个意味着某种含义:
| 向量 | 含义 |
|---|---|
| 流动(向左) | "下一个节拍" — 中性的前进进展 |
| 向上 | 提升 — 结论或揭示高于之前的内容 |
| Z 向前(缩放穿越) | 推入同一想法的更深层次 |
| Z 向后(反向缩放) | 到达 — 更重大的事物降临 |
| 缩放爆发(爆炸退出) | 离开一个世界 — 表面从摄像机前掠过 |
- 绝不要在连续接缝中运行相反方向——来回切换读作错误。
- 方向改变需要可见原因(点击/弹跳/碰撞)或章节边界。
向量台账
在创作任何主时间线之前编写它——作为项目根目录下的 ledger.json(模式:references/seam-gate.md)。每个接缝一行:剪辑时间、退场和入场向量(轴+有符号方向;Z 行携带缩放符号)、选择器、技术。退场和入场必须匹配;如果某行不匹配,修复计划,而非缓动。验证器在运行时采样之前静态检查行一致性。
载体
眼睛跟随对象,而非抽象概念。最强的接缝在剪辑处传递一个具体的载体,并匹配位置和速度:光标中途路径、缩合/对接入下一个布局的容器、飞入其确切位置的标记、瀑布剪辑的单词组。没有自然载体时,场景主角承载它(部分移动 + 早期淡出,入场中途飞行)。绝不要使用交叉淡入淡出——它根本没有载体。
因果运动
将动作链接起来,使每个移动明显由上一个启动:点击 → 压缩 → 松开发射 → 飞行 → 撞击 → 回弹 → 揭示。
- 效果在导致帧上开始——相同时间线位置,绝不要“稍后”。
- 反应与隐含质量成比例:大元素反弹更慢,小元素快速弹回。
- 力是改变方向的许可证;无原因的翻转是来回切换。
无缝门(构建门 — 运行验证器,退出代码为 0 或接缝未完成)
node <SKILL_DIR>/scripts/seam-stamp.mjs --ledger ledger.json --write index.html # 生成
node <SKILL_DIR>/scripts/seam-gate.mjs verify --ledger ledger.json --project . # 验证
该脚本(用法 + 台账模式:references/seam-gate.md)在数值上强制执行每个接缝:台账行一致性、退场在剪辑时仍在运动、入场中途飞行(绝不要从静止开始)、测量方向 = 台账方向、入场/退场速度匹配(警告)、零重叠(每帧仅一侧可见 — 剪辑不是溶解)、Z 符号规则(d(scale)/dt 两侧符号相同;扫描入场场景自身的入场是否存在符号冲突)、以及包含祖先缩放的载体矩形连续性。在编写台账时使用 seam-gate.mjs probe --t <cut> 找到每个接缝的真实载体选择器。
脚本无法检查的规则——仍然由你负责:
- 编辑重新打开接缝。 对场景的前/后约 1 秒的任何更改(包括为新的配音重新计时)都会使该边界的审计失效——重新运行验证器。
- 音频是时钟。 根据配音的实际单词时间戳重新计时场景;绝不要为了适应槽位而匆忙朗读。配音重新生成会重新打开其接缝。
- 剪辑门控陷阱(零重叠失败的常见原因):
data-start在其入场补间之前的剪辑在其初始不透明度下取消隐藏——设置初始autoAlpha: 0并且data-start= 剪辑时间,绝不要更早。
第二部分 — 表演(场景持续表演)
无空闲抖动
空闲正弦循环(呼吸、浮动、漂移、发光脉冲)被禁止作为持续运动——它们读作“视频在等待”。一个入场后还剩几秒钟的场景是规划错误:添加故事,而不是抖动。入场和退场之间的每个阶段由以下路线之一拥有(在计划中命名路线):
| 路线 | 是什么 |
|---|---|
| 分阶段揭示 | 保留内容;在叙述节拍上兑现它——画面不断获得信息(≥2 个内容组的默认方式) |
| 带意图的摄像 | 映射的缩放+平移路径:建立广角 → 移动 → 到达主体 |
| 序列化 UI 生命 | 产品随时间变化:进度推进、高亮步骤、计数滴答 |
| 动画序列 | 元素表演一个节拍:卡片归档到堆栈、项目被拖动、结果组装 |
| 光标引导动作 | 超大光标引导眼睛到触发器;其点击点燃下一个节拍(oversized-cursor) |
测试:在任意时间暂停——必须有意义的事情在空中飞行(揭示着陆、摄像机移动、UI 正在做叙述所说的内容)。
高潮前的静止
在主要动作和其结果之间安排一个 0.3–0.75 秒的暂停——戏剧性的逗号。直接从动作跳到结果的场景会失去它。
计时意图
- 单次入场 ≤ 约 800 毫秒;更长的铺垫 = 多元素交错,而非一个慢元素。
- 退场 ≈ 入场的 75%。异常:cut-the-curve 反转此规则(入场约 127% 的退场)。
- 总交错 ≤ 500 毫秒;对于 8 个以上元素,收紧每个项目的延迟或交错前几个。
- 禁止的缓动:
bounce.out/elastic.out。入场超调back.out(1.4–1.7)可以。 - 相似元素共享一个缓动+持续时间意图——绝不要为每个元素设置唯一的对。
过渡词汇表
每部影片仅使用 2–3 种场景间过渡并重复使用;默认边界是在流动方向上的 cut-the-curve。手写共享元素变形(intent: morph)不计入预算。
反模式
| 不要 | 改为 |
|---|---|
| 孤立创作每个场景的入场 | 先编写向量台账 |
| 场景间交叉淡入淡出 | 在流动方向上使用 cut-the-curve |
| 退场完成,然后场景改变 | 两侧均在运动中剪辑 |
| 剪辑后入场从静止开始 | 进入 ≥50% 的概念路径 |
| 反向缩放退场 → 从小变大入场(或推 → 超大回缩) | 匹配缩放速度符号(无缝门 7) |
| 入场场景自身的弹出介绍在 Z 接缝交接下 | 保持其开场构图,或匹配符号 |
| 空闲抖动/呼吸/浮动以填充时间 | 分配持续运动路线;或添加故事 |
| 无原因的方向翻转 | 使用一个力,或保持流动 |
| 保留向量用作多样性 | 默认为流动;将它们用于含义 |
| 反应在其原因后几帧 | 同帧点火 |
| 动作直接跳到结果 | 安排高潮前静止(0.3–0.75 秒) |