运动法则(网关)
在编排任何动画之前请先阅读此内容。它决定了每个接缝处会发生什么以及每个场景如何表演;技术技能负责实现它。这些法则覆盖通用/上游运动指南。此法则防止的失败:孤立创作的场景——眼睛的动势在每个镜头切换处消亡,且场景在进入和退出之间原地晃动。
路线图
| 决策(本技能) | 实现技能 |
|---|---|
| 接缝过渡选择 + 参数 + 代码 | 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 变形/匹配切换;标记的接缝在构造上通过关卡。
第 1 部分 — 接缝法则
向量法则
场景 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> 查找每接缝的真实载体选择器。
脚本无法检查的规则 — 仍然属于你:
- 编辑重新打开接缝。 对场景首/末 ~1s 的任何更改(包括为新的配音重新定时)都会使该边界的审计失效 — 重新运行验证器。
- 音频是时钟。 根据配音的真实词时间戳重新定时场景;切勿为了适应时间段而加快朗读。配音重新生成会重新打开其接缝。
- 剪裁-门控陷阱(导致零重叠失败的常见原因):一个
data-start早于其进入补间的剪裁在初始不透明度下未被隐藏 — 设置初始autoAlpha: 0ANDdata-start= 切换时间,绝不能更早。
第 2 部分 — 表演(场景持续表演)
禁止空转摆动
空闲的正弦循环(呼吸、漂浮、漂移、脉冲辉光)被禁止作为持续运动——它们读作“视频在等待”。一个完成进入后还剩几秒的场景是规划错误:添加故事,而非摆动。进入和退出之间的每个阶段由以下路径之一拥有(在计划中命名路径):
| 路径 | 内容 |
|---|---|
| 分阶段揭示 | 保留内容;在叙述节拍上回报它们——画面持续获取信息(默认用于 ≥2 个内容组) |
| 有意图的摄像机 | 一个有映射的缩放+平移路径:建立广角 → 移动 → 到达主体 |
| 序列化 UI 生命 | 产品随时间表现:进度前进、高亮步骤、计数滴答 |
| 动画序列 | 元素表演一个节拍:卡片归档到堆栈、项目被拖拽、结果组装 |
| 光标引导动作 | 一个超大光标引导眼睛到触发器;其点击点燃下一个节拍 (oversized-cursor) |
测试:暂停任一秒——必须有有意义的事物正在中途(一个揭示正在降落、摄像机正在移动、UI 正在做叙述所说的事情)。
高潮前静止
在主要动作及其结果之间安排一个 0.3–0.75s 暂停——戏剧性的逗号。一个从动作直接跳到结果的场景会失去它。
定时意图
- 单一进入 ≤ ~800ms;更长的构建 = 多元素交错,而非一个慢元素。
- 退出 ≈ 进入的 75%。例外:cut-the-curve 反转此规则(进入 ~127% 退出)。
- 总交错 ≤ 500ms;有 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.75s) |