关于 motion-doctrine
motion-doctrine 是供 Agent 制作动画 HTML 视频的技能,规定场景间如何衔接运动及场景内如何持续运动,并用向量台账和验证器检查转场一致性。
主要功能
- 01跨剪辑匹配运动的规则
- 02用于规划转场的向量台账
- 03转场验证与标记命令
- 04场景持续运动的设计路径
- 05因果动画时序指导
适用场景
- 01规划视频场景间的转场
- 02检查剪辑方向与速度
- 03让场景在转场间保持动态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ heygen-com/ hyperframes --skill motion-doctrine安装后在 Claude Code 中输入/motion-doctrine确认已加载。
详细介绍
Motion Doctrine(Gateway)
在编写任何动画之前,请先阅读本文。它规定每个衔接处发生什么,以及每个场景如何呈现;具体技术由相关技能实现。这些规则优先于通用/上游的运动指导。它们要避免的问题是:场景孤立创作——每次剪切都会让观众的动量感消失,场景则在入场和退场之间原地摇摆。
路线图
| 决策(本技能) | 实现技能 |
|---|---|
| 衔接转场选择 + 参数 + 代码 | 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。 - 相位 — 剪切在两侧都必须落在运动中途。剪切前先停稳,或剪切后从静止开始,都会形成死拍。
流向
每部影片都选定一个主要方向(默认方向:LEFT)。所有普通衔接都使用这个方向。其他矢量应当保留——使用它们就必须有所意图:
| 矢量 | 含义 |
|---|---|
| 当前流向(LEFT) | “下一拍”——中性的向前推进 |
| 向上 | 升高——结论或揭示升至此前内容之上 |
| Z 轴向前(穿越式缩放) | 深入同一个思路 |
| Z 轴向后(反向缩放) | 抵达——某个更大的事物落定 |
| 缩放爆发(向外炸开) | 离开一个世界——一个表面从摄像机前疾驰而过 |
- 绝不要连续使用方向相反的衔接——来回反复会显得像出错。
- 改变方向必须有可见的原因(点击/弹跳/冲击)或章节边界。
Vector Ledger
编写任何主时间线之前,先在项目根目录创建 ledger.json(架构见 references/seam-gate.md)。每个剪接点一行:剪切时间、离场与入场向量(轴 + 正负方向;Z 行包含缩放符号)、选择器、技巧。离场与入场必须匹配;如果某行不匹配,应修正计划,而不是缓动。验证器会在任何运行时采样之前,静态检查行的一致性。
载体
眼睛追随的是物体,而不是抽象概念。最有力的剪接点会在剪切时以匹配的位置和速度交接一个具体载体:路径中的光标、缩小并停靠到下一布局中的容器、飞入精确位置的标记、瀑布式剪切中的文字组。没有自然载体时,由场景主体来承接(部分移动 + 提前淡出,入场时处于飞行中)。绝不交叉淡化——它完全没有载体。
因果运动
将动作串联起来,让每个动作都明显由上一个动作触发:点击 → 挤压 → 释放弹簧 → 飞行 → 撞击 → 回弹 → 揭示。
- 效果从触发它的帧开始——时间线上位置相同,绝不能“稍后”。
- 反应幅度应与暗示的质量相匹配:大型元素回弹较慢,小型元素迅速弹回。
- 力是改变方向的依据;没有原因的翻转就是乒乓式往返。
剪接点门禁(构建门禁——运行验证器,退出码为 0,否则剪接点就尚未完成)
node <SKILL_DIR>/scripts/seam-stamp.mjs --ledger ledger.json --write index.html # generate
node <SKILL_DIR>/scripts/seam-gate.mjs verify --ledger ledger.json --project . # verify
该脚本(用法 + ledger 架构:references/seam-gate.md)会针对每个剪接点以数值方式强制检查:ledger 行一致性、离场在剪切时仍在运动、入场处于飞行中(绝不能从静止开始)、测得的方向与 ledger 方向一致、入场/离场速度匹配(警告)、零重叠(每帧只显示一侧——剪切不是溶解)、Z 符号规则(两侧的 d(scale)/dt 符号相同;还会扫描入场场景自身的进场动画是否存在符号冲突),以及包含祖先缩放在内的载体矩形连续性。编写 ledger 时,使用 seam-gate.mjs probe --t <cut> 查找每个剪接点的真实载体选择器。
脚本无法检查的规则——仍需由你把关:
- 编辑会使剪接点审计失效。 对场景开头/结尾约 1 秒范围内的任何更改(包括为配合新的 VO 而重新计时)都会使对应边界的审计失效——请重新运行验证器。
- 音频就是时钟。 根据 VO 的实际单词时间戳重新调整场景时间;绝不要为了塞进时间段而加快朗读。重新生成 VO 会使相关剪接点的审计失效。
- 剪辑门控注意事项(零重叠检查失败的常见原因):如果剪辑的
data-start早于其入场补间动画,那么它会以初始不透明度显示——将初始值设为autoAlpha: 0,并将data-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)不计入预算。
反模式
| 不要 | 应该 |
|---|---|
| 孤立地编排每个场景的入场 | 先编写向量账本 |
| 在场景之间交叉淡化 | 沿当前动势的方向切断曲线 |
| 先完成退场,再切换场景 | 在两侧动作进行到一半时切断 |
| 切换后从静止状态开始入场 | 从设想路径的 ≥50% 处开始入场 |
| 反向缩放退场 → 从小尺寸放大入场(或推出 → 放大后缩回) | 匹配缩放速度的符号(Seam Gate 7) |
| Z 接缝交接时,在入场场景中加入自身的弹入式开场 | 保持开场画面构图不变,或匹配符号 |
| 用静止状态下的摇摆/呼吸/漂浮填充时间 | 指定持续运动路线,或添加故事 |
| 没有原因就反转方向 | 消耗一个力,或保持当前动势 |
| 把保留向量当作变化手段 | 默认保持当前动势;将保留向量用于表达意义 |
| 在起因发生几帧后才做出反应 | 同帧触发 |
| 动作直接跳到结果 | 安排高潮前的静止时段(0.3–0.75s) |