用途
Motion Doctrine 是 HyperFrames 动画与视频合成流程中的网关技能,需在任何动画编排之前首先加载。它决定每个接缝处发生什么、每个场景如何持续表演;具体技法由下层技能实现。它声称这些规则优先于通用的、上游的运动指导。
它要防止的失败情形是:场景各自孤立地制作——视觉动量在每次剪切处中断,场景在进入与退出之间原地晃动。
主要能力
路由图:本技能负责决策,实现交由技法技能:接缝过渡选择、参数与代码交给 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% 处接上)。 - 相位——剪切落在两侧的运动中途。剪切前先静止、或剪切后从静止开始,都是死拍。
主线(The Current):每部影片选定一个主导方向(默认 LEFT)。所有普通接缝都使用它。其他向量是被保留的——动用它们意味着表达含义:主线(LEFT)=“下一拍”中性前进;向上 = 升华,结论或揭示高于前文;Z 向前(穿越式缩放)= 向同一思路更深处推进;Z 向后(反向缩放)= 到达,更大的东西落地;缩放爆裂(向外爆开)= 离开一个世界,某个表面从镜头旁炸开。绝不连续使用相反方向的接缝——来回弹跳会被读作错误。方向改变需要可见的原因(点击/弹跳/撞击)或章节边界。
向量台账:在编写任何主时间线之前先写下它,作为项目根目录的 ledger.json(模式见 references/seam-gate.md)。每个接缝一行:剪切时间、退出与进入向量(轴 + 带符号方向;Z 行携带缩放符号)、选择器、技法。退出与进入必须匹配;若某行不匹配,修计划,不要修缓动。校验器会在任何运行时采样之前静态检查行的一致性。
载体:眼睛跟随物体而非抽象。最强的接缝会在匹配的位置和速度上把一个具体载体递交过剪切:路径中途的光标、缩小/停靠进下一布局的容器、飞入其确切位置的标记、瀑布式剪切的词组。若无自然载体,则由场景主角承载(部分位移 + 提前淡出,进入在半途)。绝不使用交叉淡化——它完全没有载体。
因果运动:把运动串成链,每个动作都由上一个可见地引发:点击 → 挤压 → 释放弹簧 → 飞行 → 撞击 → 回弹 → 揭示。效果在引发它的那一帧启动——同一时间线位置,绝不“稍后”。反应随隐含质量缩放:大元素回弹更慢,小元素更干脆。力是改变方向的许可证;无因的反转是乒乓球。
Seam Gate(构建闸门):
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
脚本按接缝以数值方式强制执行:台账行一致性、退出在剪切时仍在移动、进入处于半途(绝不从静止开始)、测得方向 = 台账方向、进入/退出速度匹配(WARN)、零重叠(每帧只有一侧可见——剪切不是溶解)、Z 符号规则(两侧 d(scale)/dt 同号;进入场景自身的进入动画会被扫描以查符号冲突)、载体矩形连续性(含祖先缩放)。在编写台账时可用 seam-gate.mjs probe --t <cut> 找出每个接缝的真实载体选择器。脚本无法检查、仍需自行负责的规则:编辑会重新打开接缝,任何对场景首/尾约 1 秒的改动(包括为新的旁白重新计时)都会使该边界的审计失效,需重跑校验器;音频是时钟,按旁白的真实词时间戳为场景重新计时,绝不为了塞进时段而催促朗读,旁白重生成会重新打开其接缝;clip-gating 陷阱(零重叠失败最常见的原因):data-start 早于其进入补间的 clip 会在初始不透明度下未被隐藏——将初始设为 autoAlpha: 0 且 data-start = 剪切时间,绝不更早。
第二部分:表演(场景持续表演)
禁止怠速晃动:怠速正弦循环(呼吸、漂浮、漂移、辉光脉冲)作为持续运动被禁止——它们读起来像“视频在等待”。一个进入完成后还剩数秒的场景是规划错误:加故事,不要加晃动。进入与退出之间的每个阶段由以下路线之一负责(在计划中写明路线):分阶段揭示(扣住内容,在旁白节拍上偿付——默认用于 ≥2 个内容组);带意图的镜头(映射的缩放+平移路径:建立全景 → 移动 → 抵达主体);有次序的 UI 生命(产品随时间表现:进度推进、高亮分步、计数跳动);动画序列(元素演出一拍:卡片归档进堆叠、条目被拖拽、结果组装);光标主导的动作(超大光标把视线引向触发器;它的点击点燃下一拍)。测试:在任意一秒暂停——必须有有意义的东西正在半途中(一次揭示落地、镜头在移动、UI 在做旁白所说的事)。
高潮前的静止:在主要动作与其结果之间安排 0.3–0.75 秒的暂停——戏剧性逗号。直接从动作跳到结果的场景会失去它。
计时意图:单次进入 ≤ 约 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% 处进入;避免反向缩放的退出 → 从小放大的进入(或推 → 超大回缩),而应匹配缩放速度的符号(Seam Gate 7);避免在 Z 接缝交接下让进入场景自身的弹入式开场,而应让其开场帧保持构图,或匹配符号;不要用怠速晃动/呼吸/漂浮填补时间,而应指定持续运动路线,或加故事;不要无因翻转方向,而应动用一次力,或保持主线;不要把保留向量当作花样使用,而应默认使用主线,把它们用在含义上;不要让反应在起因后几帧才发生,而应同帧点火;不要让动作直接跳到结果,而应安排高潮前的静止(0.3–0.75s)。
限制
以上内容均来自技能自身文档。具体的 SKILL_DIR 路径、ledger 模式的完整字段定义、脚本的内部实现细节、以及各下层技能(cut-the-curve、oversized-cursor、seam-craft、overlays)的具体参数与代码,资料中仅给出名称与引用位置,暂未提供完整内容。