mcpField
M
motion-doctrine

motion-doctrine

github.com/heygen-com创意与媒体74.7k61.0k 次安装今天更新
代码仓库

关于 motion-doctrine

motion-doctrine 是供 Agent 制作动画 HTML 视频的技能,规定场景间如何衔接运动及场景内如何持续运动,并用向量台账和验证器检查转场一致性。

主要功能

  1. 01跨剪辑匹配运动的规则
  2. 02用于规划转场的向量台账
  3. 03转场验证与标记命令
  4. 04场景持续运动的设计路径
  5. 05因果动画时序指导

适用场景

  1. 01规划视频场景间的转场
  2. 02检查剪辑方向与速度
  3. 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 如何入场:轴线相同、方向相同、速度匹配,两侧都在运动中途剪切。

  1. 轴线 — x 保持 x,y 保持 y,Z 保持 Z。剪切前后绝不切换轴线。
  2. 方向 — 绝不镜像。在 Z 轴上,方向 = 缩放变化的正负:变大 = 推进(摄像机前移),变小 = 拉远(摄像机后移)。后退式退场若接上由小变大的入场,就是矢量镜像——这是最常见的违规,因为由小变大是元素入场的默认方式。
  3. 速度 — 入场初速度 ≈ 退场末速度,通过镜像缓动实现(退场用 power4.in + 入场用 power4.out,距离和时长相同;入场侧至少走过假定路径的 50%)。具体机制见 cut-the-curve。
  4. 相位 — 剪切在两侧都必须落在运动中途。剪切前先停稳,或剪切后从静止开始,都会形成死拍。

流向

每部影片都选定一个主要方向(默认方向: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. 编辑会使剪接点审计失效。 对场景开头/结尾约 1 秒范围内的任何更改(包括为配合新的 VO 而重新计时)都会使对应边界的审计失效——请重新运行验证器。
  2. 音频就是时钟。 根据 VO 的实际单词时间戳重新调整场景时间;绝不要为了塞进时间段而加快朗读。重新生成 VO 会使相关剪接点的审计失效。
  3. 剪辑门控注意事项(零重叠检查失败的常见原因):如果剪辑的 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)

评论

支持 Markdown