motion-doctrine
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseMotion Doctrine (Gateway)
运动法则(Gateway)
Read this before composing any animation. It decides WHAT happens at every seam and how
every scene performs; the technique skills implement it. These rules supersede generic /
upstream motion guidance. The failure this prevents: scenes authored in isolation — the
eye's momentum dies at every cut, and scenes wobble in place between entry and exit.
制作任何动画前请先阅读本文。它定义了每个场景接缝处的表现以及每个场景的运动方式;具体技术技巧则用于实现这些规则。这些规则优先于通用/上游的运动指导方案。它能避免的问题:单独制作场景会导致观众的视觉连贯性在每个转场处中断,且场景在入场和退场之间出现无意义晃动。
Route map
路径映射
| Decision (this skill) | Implementation skill |
|---|---|
| Seam transition choice + parameters + code | |
| Text / element entry cascades | |
| In-scene group repositioning (no cut) | |
| Cursor-led action / scene kickoff / morph ignition | |
| Seam render mechanics / white-flash guard | |
| Product-launch / explainer / caption work | overlays |
Authoring order: vector ledger () → STAMP the master seams from it
() → sustained-motion
route per phase → carriers and causes → build comps → VERIFY ().
Hand-author only Tier-A morphs/match-cuts; stamped seams pass the gate by construction.
ledger.jsonscripts/seam-stamp.mjs --ledger ledger.json --write index.htmlscripts/seam-gate.mjs| 决策(本规则) | 实现技巧 |
|---|---|
| 接缝转场选择+参数+代码 | |
| 文本/元素瀑布式入场 | |
| 场景内组重定位(无转场) | |
| 光标引导操作/场景启动/形态触发 | |
| 接缝渲染机制/白闪防护 | |
| 产品发布/讲解/字幕工作 | 在上述规则基础上叠加 |
创作顺序:向量台账()→ 从中生成主接缝标记()→ 为每个阶段规划持续运动路径 → 确定载体与触发因素 → 制作合成内容 → 校验()。
仅手动创作A级形态变换/匹配剪辑;标记生成的接缝默认符合校验要求。
ledger.jsonscripts/seam-stamp.mjs --ledger ledger.json --write index.htmlscripts/seam-gate.mjsPart 1 — The Seam Law
第一部分——接缝法则
The Vector Law
向量法则
How Scene A exits determines how Scene B enters: same axis, same direction, matched speed, cut mid-motion on both sides.
- Axis — x stays x, y stays y, Z stays Z. Never trade axes across a cut.
- Direction — never mirror. On Z, direction = the SIGN of scale change: growing = push (camera forward), shrinking = pull (camera back). A receding exit answered by a grow-from-small entry is a mirrored vector — the most common violation, because grow-from-small is the default element entrance.
- Speed — entry initial velocity ≈ exit final velocity, via mirrored eases (exit
+ entry
power4.in, same distance and duration; the incoming side picks up ≥50% through the notional path). Mechanics inpower4.out.cut-the-curve - Phase — the cut lands mid-motion on BOTH sides. Settling to rest before the cut, or starting from rest after it, is a dead beat.
场景A的退出方式决定场景B的入场方式:同一轴、同一方向、速度匹配、两侧均在运动中途完成转场。
- 轴 — x轴保持x轴,y轴保持y轴,Z轴保持Z轴。转场时绝不能切换轴。
- 方向 — 绝不能镜像。在Z轴上,方向=缩放变化的符号:放大=推进(镜头向前),缩小=拉远(镜头向后)。以缩小退出对应放大入场属于向量镜像——这是最常见的违规情况,因为放大入场是元素入场的默认方式。
- 速度 — 入场初始速度≈退场最终速度,通过对称缓动实现(退场使用+ 入场使用
power4.in,距离和时长相同;入场侧需完成至少50%的预设路径)。具体机制见power4.out。cut-the-curve - 阶段 — 转场需在两侧场景均处于运动中途时完成。转场前静止或转场后从静止开始都会破坏连贯性。
The Current
主方向
Every film picks ONE dominant direction (house default: LEFT). Every ordinary seam uses
it. Other vectors are RESERVED — spending one means something:
| Vector | Meaning |
|---|---|
| The current (LEFT) | "next beat" — neutral forward progress |
| Upward | elevation — a conclusion or reveal rises above what came before |
| Z forward (zoom-through) | pushing deeper into the same thought |
| Z backward (inverse zoom) | ARRIVAL — something bigger lands |
| Scale-burst (explode out) | leaving a world — a surface blasts past camera |
- Never run consecutive seams in opposing directions — ping-pong reads as an error.
- A direction change needs a visible cause (click / bounce / impact) or a chapter boundary.
每部影片需选定一个主导方向(默认:左)。所有常规接缝均使用该方向。其他向量为预留向量——使用这类向量意味着特定含义:
| 向量 | 含义 |
|---|---|
| 主方向(左) | "下一节点" — 中性的向前推进 |
| 向上 | 升华——结论或展示内容高于之前的内容 |
| Z轴向前(穿入缩放) | 深入同一主题 |
| Z轴向后(反向缩放) | 登场——更重要的内容出现 |
| 缩放爆发(向外炸开) | 离开当前场景——画面元素快速掠过镜头 |
- 绝不能连续使用方向相反的接缝——来回切换会被视为错误。
- 方向变化需要可见的触发因素(点击/弹跳/碰撞)或章节边界。
The Vector Ledger
向量台账
Write it before authoring any master timeline — as at the project root
(schema: ). One row per seam: cut time, exit and entry vectors
(axis + signed direction; Z rows carry the scale sign), selectors, technique. Exit and
entry must match; if a row mismatches, fix the plan, not the easing. The verifier checks
row consistency statically before any runtime sampling.
ledger.jsonreferences/seam-gate.md在制作主时间线前需编写向量台账——保存为项目根目录下的****( schema见)。每个接缝对应一行:转场时间、退场和入场向量(轴+带符号方向;Z轴行需包含缩放符号)、选择器、技巧。退场和入场向量必须匹配;若某行不匹配,需调整方案而非修改缓动。校验工具会在运行前静态检查每行的一致性。
ledger.jsonreferences/seam-gate.mdCarriers
载体元素
The eye follows objects, not abstractions. The strongest seams hand a concrete carrier
across the cut at matched position AND velocity: a cursor mid-path, a container that
shrinks/docks into the next layout, a mark that flies into its exact slot, the word group
of a waterfall cut. With no natural carrier, the scene heroes carry it (partial travel +
early fade, entry mid-flight). Never a crossfade — it has no carrier at all.
观众的视线跟随具体物体而非抽象元素。最流畅的接缝会在转场时传递一个具体载体元素,位置和速度均匹配:运动途中的光标、缩小后嵌入下一布局的容器、飞入对应位置的标记、瀑布式转场的文字组。若无自然载体,则由场景核心元素承担(部分移动+近于消失,入场时处于飞行中途)。绝不能使用交叉淡入淡出——这种转场没有任何载体元素。
Causal Motion
因果运动
Chain motion so each move is visibly launched by the last: click → squash → release
spring → flight → impact → recoil → reveal.
- Effects start ON the causing frame — same timeline position, never "shortly after."
- Reactions scale with implied mass: big elements rebound slower, small ones snap.
- A force is a license to change direction; an uncaused flip is a ping-pong.
运动需形成链式关联,每个动作都由上一个动作明显触发:点击 → 挤压 → 释放回弹 → 移动 → 碰撞 → 反冲 → 展示。
- 效果需在触发帧开始——同一时间线位置,绝不能“稍后触发”。
- 反应幅度与元素的隐含质量成正比:大元素回弹慢,小元素快速弹动。
- 外力是方向变化的合理依据;无触发的方向翻转属于来回切换错误。
The Seam Gate (build gate — run the verifier, exit 0 or the seam is not done)
Seam Gate(构建校验——运行校验工具,返回0表示通过,否则接缝未完成)
bash
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 . # verifyThe script (usage + ledger schema: ) numerically enforces, per
seam: ledger-row consistency, exit still moving at the cut, entry mid-flight (never from
rest), measured direction = ledger direction, entry/exit speed match (WARN), zero
overlap (one side visible per frame — the cut is not a dissolve), the Z sign rule
(d(scale)/dt same sign both sides; the incoming scene's own entrances are scanned for
sign-fighting), and carrier rect continuity with ancestor scale included. Use
to find each seam's true carrier selectors when authoring
the ledger.
references/seam-gate.mdseam-gate.mjs probe --t <cut>Rules the script cannot check — still yours:
- Edits re-open the seam. Any change to a scene's first/last ~1s (including re-timing to new VO) invalidates that boundary's audit — re-run the verifier.
- Audio is the clock. Re-time scenes to the VO's real word timestamps; never rush a read to fit a slot. A VO regen re-opens its seams.
- Clip-gating gotcha (the usual cause of a zero-overlap FAIL): a clip whose
precedes its entry tween is un-hidden at its initial opacity — set initial
data-startANDautoAlpha: 0= the cut time, never earlier.data-start
bash
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 . # 校验该脚本(使用方法+台账schema见)会对每个接缝进行数值校验:台账行一致性、退场时处于运动状态、入场时处于飞行中途(绝非从静止开始)、实际方向与台账方向一致、入场/退场速度匹配(警告)、零重叠(每帧仅显示一侧内容——转场不是溶解效果)、Z轴符号规则(两侧缩放变化率符号相同;会扫描入场场景自身的入场动画是否存在符号冲突),以及包含祖先缩放的载体矩形连续性。创作台账时,可使用查找每个接缝的真实载体选择器。
references/seam-gate.mdseam-gate.mjs probe --t <cut>脚本无法校验的规则——仍需人工检查:
- 修改会重新触发接缝校验。对场景首尾约1秒内容的任何修改(包括根据新旁白重新调整时间)都会使该边界的校验失效——需重新运行校验工具。
- 音频是时间基准。根据旁白的实际单词时间戳调整场景时长;绝不能为了适配时长而仓促朗读。旁白更新后需重新校验其对应的接缝。
- 剪辑校验陷阱(零重叠失败的常见原因):早于入场补间的剪辑会在初始透明度下显示——需设置初始
data-start且autoAlpha: 0=转场时间,绝不能早于转场时间。data-start
Part 2 — Performance (the scene keeps performing)
第二部分——表现(场景需持续呈现动态效果)
No idle wobble
禁止无意义晃动
Idle sine loops (breathe, float, drift, glow pulse) are BANNED as sustained motion — they
read as "the video is waiting." A scene that finishes entering with seconds left is a
planning bug: add story, not wobble. Every phase between entry and exit is owned by one
of these routes (name the route in the plan):
| Route | What it is |
|---|---|
| Staged reveals | Hold content back; pay it off on narration beats — the frame keeps gaining information (default for ≥2 content groups) |
| Camera with intent | A mapped scale+pan path: establish wide → travel → arrive on the subject |
| Sequenced UI life | The product behaves over time: progress advances, highlights step, counts tick |
| Animated sequences | Elements act out a beat: a card files into a stack, an item gets dragged, a result assembles |
| Cursor-led action | An oversized cursor walks the eye to a trigger; its CLICK ignites the next beat ( |
Test: pause at any second — something meaningful must be mid-flight (a reveal landing,
the camera traveling, the UI doing what the narration says).
闲置正弦循环(微动、漂浮、漂移、发光脉冲)作为持续运动是被禁止的——这类效果会传递“视频在等待”的信号。入场完成后仍有剩余时间的场景属于规划失误:应添加内容,而非无意义晃动。入场和退场之间的每个阶段需采用以下路径之一(在方案中明确路径名称):
| 路径 | 说明 |
|---|---|
| 分阶段展示 | 保留部分内容;在旁白节点处逐步呈现——画面持续增加信息(适用于≥2个内容组的默认方案) |
| 有目的的镜头移动 | 预设的缩放+平移路径:从广角开始 → 移动 → 聚焦到主体 |
| 有序的UI动态 | 产品随时间变化:进度推进、高亮步骤、数字跳动 |
| 动画序列 | 元素呈现特定节点:卡片归入堆叠、物品被拖动、结果逐步组装 |
| 光标引导操作 | 超大光标引导视线到触发点;点击触发下一节点( |
测试方法:在任意时间点暂停——画面中必须有有意义的动态正在进行(展示内容落地、镜头移动、UI执行旁白描述的操作)。
Stillness before climax
高潮前静止
Schedule a 0.3–0.75s pause between the major action and its result — the dramatic
comma. A scene that jumps straight from action to result loses it.
在主要动作和结果之间安排0.3–0.75秒的停顿——这是戏剧性的停顿。直接从动作跳到结果会失去这种效果。
Timing intents
时间规划原则
- Single entry ≤ ~800ms; longer buildup = multi-element stagger, not one slow element.
- Exit ≈ 75% of entry. Exception: cut-the-curve inverts this (entry ~127% of exit).
- Total stagger ≤ 500ms; with 8+ elements, tighten per-item delay or stagger the first few.
- Forbidden eases: /
bounce.out. Entry overshootelastic.outis fine.back.out(1.4–1.7) - Similar elements share one ease+duration intent — never a unique pair per element.
- 单个元素入场时长≤约800毫秒;更长的准备时间应采用多元素 stagger(错峰),而非单个元素缓慢入场。
- 退场时长≈入场时长的75%。例外情况:cut-the-curve会反转此比例(入场时长≈退场时长的127%)。
- 总错峰时长≤500毫秒;元素数量≥8个时,缩短单个元素的延迟时间或仅错峰前几个元素。
- 禁止使用的缓动:/
bounce.out。入场时的过冲效果elastic.out是允许的。back.out(1.4–1.7) - 同类元素需使用相同的缓动+时长设置——绝不为每个元素单独设置。
Transition vocabulary
转场词汇
Use only 2–3 inter-scene transitions per film and repeat them; the default boundary is
cut-the-curve in the current's direction. Hand-written shared-element morphs
() don't count against the budget.
intent: morph每部影片仅使用2–3种场景间转场并重复使用;默认转场为主方向上的cut-the-curve。手写的共享元素形态变换()不计入此限制。
intent: morphAnti-Patterns
反模式
| Don't | Instead |
|---|---|
| Author each scene's entrance in isolation | Write the vector ledger first |
| Crossfade between scenes | Cut-the-curve in the current's direction |
| Exit completes, THEN the scene changes | Cut mid-motion on both sides |
| Entry starts from rest after a cut | Enter ≥50% through the notional path |
| Inverse-zoom exit → grow-from-small entry (or push → oversized retraction) | Match the scale-velocity sign (Seam Gate 7) |
| Incoming scene's own pop-in intro under a Z-seam handoff | Hold its opening frame composed, or match the sign |
| Idle wobble / breathe / float to fill time | Assign a sustained-motion route; or add story |
| Direction flip without a cause | Spend a force, or keep the current |
| Reserved vectors used as variety | Default to the current; spend them on meaning |
| Reaction a few frames after its cause | Same-frame ignition |
| Action jumps straight to result | Schedule stillness-before-climax (0.3–0.75s) |
| 禁止做法 | 替代方案 |
|---|---|
| 单独制作每个场景的入场动画 | 先编写向量台账 |
| 场景间使用交叉淡入淡出 | 使用主方向上的cut-the-curve |
| 退场完成后再切换场景 | 两侧均在运动中途完成转场 |
| 转场后从静止开始入场 | 入场时完成至少50%的预设路径 |
| 反向缩放退场→放大入场(或推进→超大回缩) | 匹配缩放速度的符号(Seam Gate第7条) |
| Z轴接缝传递时,入场场景自身的弹出式开场 | 保持开场画面已组合完成,或匹配符号 |
| 使用无意义晃动/微动/漂浮填充时间 | 分配持续运动路径;或添加内容 |
| 无触发因素的方向翻转 | 使用外力触发,或保持主方向 |
| 将预留向量用作多样化效果 | 默认使用主方向;仅在传递特定含义时使用预留向量 |
| 反应在触发后几帧才出现 | 同一帧触发 |
| 动作直接跳到结果 | 安排高潮前静止(0.3–0.75秒) |