首页
/ HyperFrames 中的 Cut the Curve 转场技法:五类接缝与两项场景内动效的参数化实现

HyperFrames 中的 Cut the Curve 转场技法:五类接缝与两项场景内动效的参数化实现

2026-09-05 21:33:55作者:殷蕙予

HyperFrames 仓库在 .agents/skills/cut-the-curve/SKILL.md 中沉淀了一套面向 Agent 的视频转场技法目录:五类"接缝"(SEAM)技术——Zoom-Through、Inverse Zoom-Through、Cut the Curve、Waterfall Cut、Rack-Focus Blur-Cut——加上两项场景内(无接缝)技法:Waterfall Entry(级联入场)与 Nudge Curve(慢-快-慢群组滑移)。本篇完整继承该目录的判定表、参数表与反模式清单,并结合仓库中的 GSAP 代码模板(.agents/skills/cut-the-curve/examples/gsap-implementation.md)与 Seam Gate 验证器源码(.agents/skills/motion-doctrine/scripts/seam-gate.mjs),把"在峰值速度处切、两侧匹配方向与速度"这一核心原理落到可复制的时间轴代码与可自动校验的构建门禁上。

读完本篇,你将掌握:如何为任意场景边界选择正确的接缝类型与 Z 轴方向符号;如何按 10px/18-20px 的分层模糊规则与镜像 power4 缓动编写 GSAP 时间轴;如何用 seam-gate.mjs 在渲染前对速度匹配、零重叠、Z 符号冲突做静态+运行时校验。

一、技法目录总览:先选型,再写参数

SKILL.md 开头给出七项技法的判定表,这是整篇目录的"目录页",写任何转场前先在此定位:

# 技法 作用域 适用场景
1 Zoom-Through(正向) 场景内文本互换 Z,朝向观众 沿同一思想继续深入
2 Inverse Zoom-Through 到达 / 结果点(payoff beat) Z,远离观众 "更大的东西落定"
3 Cut the Curve 场景之间 X / Y 默认边界,即"影片电流"
4 Waterfall Cut 文本到文本接缝 X,逐词 大字节拍之间的词级交接
5 Rack-Focus Blur-Cut 同表面状态互换 X / Y / Z 你希望"被看见"的那一刀——DSLR 跟焦
6 Waterfall Entry 场景内到达(无接缝) Y,自下方 标题卡、段落开场、列表引入
7 Nudge Curve 场景内群组滑移(无接缝) X / Y 为腾出空间重排已编排的群组

五条接缝技法共享同一原理:在峰值速度处切,接缝两侧匹配方向与速度;§6/§7 是"场景内"技法,不跨越剪辑点,因此不参与转场预算(见 motion-doctrine 中"每片只用 2–3 种场景间转场"的预算规则)。接缝的"定律"层——向量定律、影片电流、向量台账(ledger)、Seam Gate 门禁——位于 motion-doctrine/SKILL.md,先读它再读本目录;全部 GSAP 代码模板(worker 版 + registry 版)集中在 examples/gsap-implementation.md

二、Z 轴方向是"符号":scale 的导数必须同号

"同轴"在 Z 轴上还不够——d(scale)/dt 的符号必须跨切点匹配。这是目录里最容易踩的坑,因为"从小长大"是元素的默认入场方式,几乎必然与一个"后退式"出场构成镜像向量:

Z 向量 出场 scale 入场 scale 对应变体
Push(前进) 增大 1 → 1.2 增大 0.75 → 1 zoom-through
Pull(后退) 缩小 1 → 0.8 缩小 1.25 → 1 inverse zoom-through

被禁的镜像:后退式出场(pull)接"从小长大"入场(实际变成了 push)——这是最常见的违规;以及前进式出场接"超大回缩"。这条约束还绑定入场场景自身的入场动效(切点 + 约 0.5s 的接缝窗口内):要么保持入场帧已编排好(composed),要么让它的入场动效与符号一致。验证方式见 Seam Gate 规则 7(z-sign-scan,下详)。

三、分层模糊逻辑:文本 10px,全屏 18–20px

所有 Z 轴变体共用一套模糊上限表。为什么分两层?因为 20px 的模糊会把字母笔画抹开(smear letterforms),让观众读到的不是"速度"而是"故障";反之,在大面积全屏表面上模糊太轻,又会被读成"渲染卡顿":

对象 峰值模糊 原因
文本尺度(标题、词组) 10px 20px 抹开字形,切点读成 glitch 而非速度
全屏表面(窗口、卡片、截图) 18–20px 大表面上模糊偏轻读成渲染 hiccup

两条硬性规则:切换帧两侧同值(峰值模糊在 swap 帧必须一致);只模糊 WRAPPER,永远不模糊子元素

四、五个接缝技法的参数与代码

1. Zoom-Through(正向 Z 切)

Z 轴速度匹配切;两条文本永不同时可见。所有元素都在"长大":出场文本向镜头加速,硬切换藏在峰值模糊里,入场文本继续长向焦平面。仅用于标题与短句。总时长 ≈ 0.4s。

阶段 Scale Blur Opacity Ease Duration
Exit 1 → 1.2 0 → 10px 1 → 0.15 power3.in(opacity 用独立 none tween) 0.2s
Cut(tl.set in: 0.75 10px out: 0 / in: 0.15
Entry 0.75 → 1 10 → 0px 0.15 → 1 expo.out 0.5s

关键点:出场 opacity 必须是独立的线性 tween——power3.in 会让 opacity 在 1 附近停留过久;入场侧所有属性共享 expo.out

gsap-implementation.md 给出 worker 版(场景内 wrapper 互换)与 registry gsap_template(injector 打在两个 clip wrapper 上,占位符 __OLD__ / __NEW__ / __T__ / __DUR__,token 表见 seam-craft/SKILL.md)。worker 版:

var EXIT_START = /* 可读文本开始离场的时间点 */;
var CUT = EXIT_START + 0.2;

// Phase 1: Exit — scale/blur 加速,opacity 独立线性淡出
tl.to(".text-a-wrapper", {
  scale: 1.2,
  filter: "blur(10px)",   // 文本尺度:10px
  duration: 0.2,
  ease: "power3.in",
  overwrite: "auto"
}, EXIT_START);
tl.to(".text-a-wrapper", { opacity: 0.15, duration: 0.2, ease: "none" }, EXIT_START);

// Phase 2: 硬切 — 两侧属性匹配
tl.set(".text-a-wrapper", { opacity: 0 }, CUT);
tl.set(".text-b-wrapper", { opacity: 0.15, scale: 0.75, filter: "blur(10px)" }, CUT);

// Phase 3: Entry — 初速度高,长尾收敛
tl.to(".text-b-wrapper", {
  scale: 1, filter: "blur(0px)", opacity: 1,
  duration: 0.5, ease: "expo.out"
}, CUT);

2. Inverse Zoom-Through(反向 Z 切)

Pull-back 镜像:出场元素后退;入场元素以超大尺寸(仿佛刚从镜头后面出来)抵达并向焦平面回缩。一切都在"缩小"。只花在有到达感/结果感的节拍上——payoff 句、巨大的回复、保持的结束态——不要用于普通边界。总时长 ≈ 0.7s(出场 30% / 入场 70%)。

阶段 Scale Blur Opacity Ease Duration
Exit 1 → 0.8 0 → 10px 1 → 0.15 power3.in(opacity 独立 none tween) ~0.2s
Cut(tl.set in: 1.25 10px out: 0 / in: 0.15
Entry 1.25 → 1 10 → 0px 0.15 → 1 expo.out ~0.5s

模糊用文本尺度的 10px;只有两侧都是全出血表面时才用 18–20px。符号纪律:入场场景必须在回缩中的 wrapper 内作为已编排帧抵达——接缝窗口内禁止"从小长大"式引入;分级入场要么在回缩落定之后开始,要么从 ≥1 起步并回缩。

registry gsap_template__DUR__ * 0.3 / __DUR__ * 0.7 实现 30/70 分段,入场侧 immediateRender: false(见 gsap-implementation.md 第 57–79 行)。

3. Cut the Curve(默认场景边界)

X/Y 速度匹配切——所有场景到场景边界的默认做法,走影片的"电流",不是点缀。出场主角向一个方向加速,切点落在运动中段,入场主角沿同一方向继续并减速。总时长 ≈ 0.6s;方向 LEFT / RIGHT / UP / DOWN(默认 LEFT)。

部分行程(partial travel):约 12% 画框(1920 下 ≈ 230px)——永远不做整屏离屏位移

方向 出场 入场起点 → 终点
Leftward x: 0 → −230 x: +230 → 0
Rightward x: 0 → +230 x: −230 → 0
Upward y: 0 → −230 y: +230 → 0
Downward y: 0 → +230 y: −230 → 0

机械要点:

  • 镜像缓动:出场 power4.in + 入场 power4.out,相同距离与时长——两者拼起来是一个 power4.inOut 的两半,切点处速度精确匹配。
  • 淡出技巧(fade trick):出场 opacity 在其行程的约 25–30% 处完成(fade ≈ 0.18–0.3s vs motion 0.3–0.34s);入场在 opacity ≈ 0.35 时于路径中段点燃(ignite)。把最后一个正在淡出的元素定到"恰好死在切点上"——一段什么都不动的空隙会读成 dead air。
  • 出场 0.2–0.4s;入场 ≥ 出场。可选模糊 8–10px。
  • 舞台底色(Stage ground)#root 必须是不透明的(background: var(--canvas-deep, var(--canvas, #000)))——中窗口的切点会打开一个"两侧透明度之和 < 1"的窗口,底色不透明时会闪白(机制详见 seam-craft/SKILL.md 的 white-flash guard 一节)。

worker 版代码(场景层):

var CUT_TIME = /* 场景过渡点 */;

// 场景 A:主角向左加速(部分行程 ≈ 12% 画框)
tl.to(".scene-a-layer", { opacity: 0, duration: 0.33, ease: "power2.in" }, CUT_TIME - 0.33);
tl.to(".hero-a-wrapper", {
  x: -230, filter: "blur(8px)",
  duration: 0.33, ease: "power4.in",   // power4.inOut 的镜像半
  overwrite: "auto"
}, CUT_TIME - 0.33);

// 硬切
tl.set(".scene-b-layer", { opacity: 1 }, CUT_TIME);
tl.set(".hero-b-wrapper", { x: 230, filter: "blur(8px)" }, CUT_TIME);

// 场景 B:主角沿同方向减速
tl.to(".hero-b-wrapper", {
  x: 0, filter: "blur(0px)",
  duration: 0.33, ease: "power4.out"   // 切点处速度匹配
}, CUT_TIME);

registry 模板里 __DX__-1920(LEFT)/ 1920(RIGHT),__DY__-1080(UP)/ 1080(DOWN),* 0.12 / * 0.21 因子产生 ~12% 的部分行程。目录明确说明:push-slide 存在但违反"部分行程 + 中运动切点"原则,优先 cut-the-curve

组合变体(cut-the-curve + zoom):叠加一个轻微 Z 分量时仍须守 Z 符号规则——两侧都缩小(出场 1 → 0.92,入场 1.08 → 1),把一层一致的 mild pull 叠在侧向切上;这里绝不允许"缩小的出场 + 从小长大的入场"。

4. Waterfall Cut(逐词的 Cut the Curve)

词粒度的 cut-the-curve——文本到文本接缝上最强的向左切。出场词在各自的曲线上依次离场,入场词以级联方式"在半空中"涌进——一道观众视线可以顺着滑过接缝的波浪。

作用域:由 worker 在单个多节拍 comp 内手写(叠层全屏 .beat 层),不是 registry/injector 类型——它 tween 的是词 span,不是 clip wrapper。进出"文本节拍块"的边界仍然用常规 registry 转场;它不计入 2–3 转场预算。

参数 为什么
Travel ±230px(~12% 画框) 部分行程 + 速度 > 整屏推进
Exit 0.34s power4.in 加速度本身就是切
Exit fade 0.18s,与 x 同起 词在 ~25–30% 行程处消失——无涂抹
Exit stagger +0.022s 阅读顺序 整行"剥离",而非整块平移
Entry 0.3s power4.out 复合曲线的后半段——速度匹配
Entry 起始 opacity 0.35 路径中段点燃;0→1 的二值跳会 pop
Entry gaps 0.05s × 0.84 衰减 加速级联,最终收敛为编排态

规则:

  • 每条链一个方向,顺电流走。Inverse zoom 只作为该链的到达节拍。
  • 构建期预置所有词为 x: +230, opacity: 0——光靠 immediateRender: false 会让未启动的词静止可见。
  • 较短的首节拍可以整行离场:其 fade 在切点前 ~0.02s 结束,下一组词点燃时它仍在"拖影"——无死隙。
  • 只动 transform/opacity(seek-safe);不透明舞台底色规则同样适用。

完整 DOM/CSS/JS 实现(含 wordExit / wordEnter 两个函数、gap *= 0.84 衰减、整行首节拍变体)见 gsap-implementation.md 第 174–240 行。核心时间轴:

// 构建期预置 —— immediateRender:false 单独用会留下静止可见的词
gsap.set([...w1, ...w2], { x: 230, opacity: 0 });

function wordExit(words, C) {
  let s = C - 0.32; // 离场在切点之前启动
  words.forEach((el) => {
    tl.to(el, { x: -230, duration: 0.34, ease: "power4.in" }, s);
    tl.to(el, { opacity: 0, duration: 0.18, ease: "power1.in" }, s); // fade 在行程 ~25-30% 处结束
    s += 0.022; // 阅读顺序 stagger
  });
}

function wordEnter(words, C) {
  let off = 0, gap = 0.05;
  words.forEach((el) => {
    tl.fromTo(
      el,
      { x: 230, opacity: 0.35 }, // 路径中段点燃,已在运动
      { x: 0, opacity: 1, duration: 0.3, ease: "power4.out", immediateRender: false },
      C + off,
    );
    off += gap;
    gap *= 0.84; // 间隙收缩 —— 级联在加速
  });
}

5. Rack-Focus Blur-Cut("被看见"的那一刀)

唯一"切点被看见"的变体:一次离焦模糊尖峰(defocus blur spike)藏住一帧硬切换——手持 DSLR 的跟焦动作。只作偶尔的点缀,用于同一视觉主题内同一表面的状态互换;永远不做默认边界

与其他技法的关键差异:出场侧直到切点保持完全不透明(模糊藏住切换——没有提前淡出);缓动用 power2.in / power2.out(软光学,不是动量)。

规则:

  • 只在叙事节拍上触发,每 ~8s ≤ 1 次;绝不在字幕中间或 hold 期间。
  • 切点必须落在峰值模糊(≥6px;峰值 8–12px,最高 16–18px)——在模糊爬升过程中切换会露出切点。
  • 轻微 scale(~1.06,镜头呼吸感)让它读起来像光学效果。
  • 两侧同方向——向量定律仍然成立。入场时长 ≥ 出场。
  • 模糊打在 wrapper 上;同一个元素不要在同一个 tween 里同时动 blur + opacity(headless 合成 bug);不要直接模糊 <video>(先包一层)。

参考实现(Z dolly 变体把 x 偏移去掉、改用 scale 0.92 → / → 1.08)见 gsap-implementation.md 第 242–256 行:

var T = /* 转场起点 */;
// Phase 1: 出场侧平移 + 模糊,保持完全不透明
tl.to("#scene-out", { x: -80, scale: 1.06, filter: "blur(12px)", duration: 0.3, ease: "power2.in" }, T);
// Phase 2: 峰值模糊处硬切
tl.set("#scene-out", { opacity: 0 }, T + 0.3);
tl.fromTo("#scene-in",
  { opacity: 1, x: 80, scale: 1.06, filter: "blur(12px)" },
  { x: 0, scale: 1, filter: "blur(0px)", duration: 0.35, ease: "power2.out" },
  T + 0.3);

五、两项场景内技法(无接缝)

6. Waterfall Entry(场景内到达级联)

不是接缝——是到达级联:词/元素从下方快速涌入(方向一致),每个元素在上一元素落定前就启动——一道加速的波浪,最终收敛为编排好的布局。用于标题卡、段落开场、列表/特性引入。它是 §4 的"接缝兄弟",不要混用两者的规则

§6 Entry(到达) §4 Waterfall Cut(接缝)
Opacity tl.set 二值 0→1,入场瞬间点亮——绝不淡入 路径 0.35 处点燃——淡出本身就是速度技巧
轴默认 Y,自下方 X,顺电流
出场侧 词在镜像 power4.in 上依次离场

编排细节:

  • 重叠而非排队——下一元素在上一元素落定的 ±2 帧内启动;间隙跨级联收缩;最后一个元素 snap 到位。
  • 速度按重量分级——重/锚点元素行程更长、时间更久;轻词/标点快速 snap:
参数 锚点/重元素 普通词 轻/标点
Y offset 60–80px 40–50px 30–48px
Duration 0.16–0.20s 0.13–0.16s 0.10–0.13s
Overlap 0–2f 间隙 1f 重叠 1–2f 重叠
  • 缓动 power4.out(要更强 snap 用 expo.out);入场绝不用 .inOut
  • 每条级联一个方向。
  • 最后一个词拆成碎片可以拉长高潮;碎片行程更远。
  • 落定后,群组通常再滑一下给下一节拍让位——那就是 §7。

完整 worker 代码(锚点 → 普通词 → 轻词 → 末词碎片 → 标点,逐元素 nextStart = prevStart + prevDuration − overlapFrames × F)见 gsap-implementation.md 第 280–311 行。

7. Nudge Curve(场景内群组滑移)

对已编排群组(词行、卡片栈、列表)做慢-快-慢重定位,用于揭示内容或腾出空间。没有任何单一内置缓动能产出它——power4.inOut 会"拍桌"式急停(smack)。在同一个属性上串三个 tween:

阶段 Ease 距离 时间 手感
1 ramp-in power3.in ~10% ~20% 几乎不动——运动被感知到,但没有冲撞
2 burst none(线性) ~65% ~18% ~2× 平均 px/frame——目的性
3 tail power4.out ~25% ~62% 衰减的蠕动直至停稳——杀死"拍桌感"

规则:

  • tail 的时间必须 ≥ ramp-in 的 3 倍。若仍"拍桌":延长 tail 的时间(不是距离),或换 power5.out
  • Phase 2 保持线性——加缓动会丢掉 burst 的对比度。
  • 新内容在 phase 2 期间揭示——burst 掩盖它的出现。
  • 纵向同比例;按行程等比缩放距离,保持时间比。

270px 左移参考值(总 0.57s);其他行程等比缩放距离、保持时间比,tail ≥ 3× ramp-in:

var t = /* 内容落定后启动 */;
tl.to(".text-row", { x: -30,  duration: 0.12, ease: "power3.in"  }, t);          // ramp-in: 11% 距离 / 21% 时间
tl.to(".text-row", { x: -210, duration: 0.10, ease: "none"       }, t + 0.12);   // burst:   67% 距离 / 18% 时间
tl.to(".text-row", { x: -270, duration: 0.35, ease: "power4.out" }, t + 0.22);   // tail:    22% 距离 / 61% 时间
// 纵向:y 轴同比例。150px 变体:-15 / -115 / -150,时间不变。

六、选型对照表与调参范围

Zoom-Through Inverse Zoom Cut the Curve Waterfall Cut
作用域 场景内文本互换 到达/结果节拍 场景之间 文本到文本接缝
Z 符号 / 轴 增大(push) 缩小(pull) X / Y X,逐词
行程/scale 1→1.2,再 0.75→1 1→0.8,再 1.25→1 ±230px ±230px
峰值模糊 文本 10px / 全屏 18–20 文本 10px / 全屏 18–20 可选 8–10px
缓动 power3.in / expo.out power3.in / expo.out power4.in / power4.out power4.in / power4.out
手感 穿过去 抵达 被侧向带过 一道浪扫过接缝

gsap-implementation.md 末尾给出两套"调参范围"表,可直接用于微调:

Zoom-Through / Inverse Zoom

参数 默认 范围
Exit scale 1.2(fwd)/ 0.8(inv) ±0.1
Entry scale 0.75(fwd)/ 1.25(inv) ±0.1
切点模糊 文本 10px / 全屏 18–20px
切点 opacity 0.15 0.1–0.2
Exit 时长 0.2s 0.15–0.3s
Entry 时长 0.5s 0.4–0.6s

Cut the Curve

参数 默认 范围
Travel 230px(~12% 画框) 150–300px
切点模糊 8px 6–10px
Exit 时长 0.33s 0.2–0.4s
Entry 时长 0.33–0.42s ≥ exit

七、反模式清单:目录自带的"不要做"

SKILL.md 以一张 20 行对照表收尾,覆盖全部七项技法,逐条继承如下:

不要 应该
zoom-through 期间两条文本同时可见 峰值模糊处硬切,一帧一文本
文本尺度对象用 20px 模糊 文本 10px;全屏才 18–20px
inverse-zoom 出场 → 从小长大入场(或 push → 超大回缩) 匹配 scale 速度的符号;在 cut±0.1s 处验证
Z-seam wrapper tween 之下,入场 comp 自带的放大入场 以编排态抵达;分级入场放在接缝落定之后,或匹配符号
切换帧两侧 blur/opacity 不一致 切点帧同值
温柔的入场缓动(power2.out 镜像出场:power4.out / expo.out
整屏离屏的出场/入场 部分行程(~12%)+ 提前淡出
切点任一侧用 .inOut 缓动 镜像 power4.in / power4.out
单个元素在切点前很久就淡完 fade 在切点前 ~0.02s 结束,或用词级联
级联间隙等距 每词 ×0.84 收缩间隙
正文用 zoom-through 仅限标题与短句
场景切点不用 cut-the-curve 它就是默认边界
连续边界用相反方向 一条电流;预留向量花在语义上
中窗口切点后面是未上色的 #root 不透明舞台底色
排队式入场(每个等前一个落定) ±1–2 帧重叠——级联是浪,不是队列
级联元素等 offset/等时长 按重量分级:锚点行程更远,标点 snap
§6 到达用渐变的 opacity 淡入 tl.set 二值 0→1——淡入与 snap 相斥(接缝切才淡;到达不淡)
群组滑移用单一缓动(power4.inOutslow() §7 三阶段链
Nudge tail 短于 ramp-in 的 3 倍 延长 tail 的时间,不是距离

八、Seam Gate:把目录变成可校验的构建门禁

目录里"verify per Seam Gate rule 7"不是口头约定——仓库提供生成+校验脚本对 seam-stamp.mjsseam-gate.mjs,用法与 ledger.json schema 见 references/seam-gate.md

# 由 ledger 生成主时间轴的接缝块(替换 // <seams:auto> … 标记块)
node .agents/skills/motion-doctrine/scripts/seam-stamp.mjs --ledger ledger.json --write index.html

# 校验 ledger 中每一条接缝(exit 0 = 门禁通过)
node .agents/skills/motion-doctrine/scripts/seam-gate.mjs verify --ledger ledger.json --project <project-dir>

# 探测切点附近在动的元素(辅助编写/修复 ledger 行)
node .agents/skills/motion-doctrine/scripts/seam-gate.mjs probe --t 44.8 --project <project-dir>

seam-gate.mjs 源码(600 行)可以确认每条检查的落点与阈值:

  • 零重叠(zero-overlap):切点前 1 帧入场侧可见、或切点后 1 帧出场侧仍可见,直接判 FAIL("reads as a dissolve"),即一帧只能有一侧可见——这对应目录"never both texts visible"的硬规则(源码 seam-gate.mjs#L435-L450)。
  • 速度匹配(speed-match):入场/出场速度比超过 SPEED_RATIO = 3seam-gate.mjs#L42-L42)判 WARN,期望 ≈1——即"镜像 power4 两半"原则的数值化。
  • Z 符号扫描(z-sign-scan):对 z 轴接缝,扫描入场侧 scanRoot 子树在接缝窗口内的 scale 变化,凡与接缝符号相逆且速率超过 EPS_Z = 0.04(effective-scale 单位/秒)的元素全部列入 offenders 并 FAIL——这正是目录"绑定入场场景自身入场动效"那条规则的自动化实现(seam-gate.mjs#L452-L473)。
  • 载体连续性(carrier-*):match-cut/morph 行要求 out/in 载体在切点±1 帧处中心偏移 ≤ CARRIER_POS_TOL = 12px、尺寸差 ≤ CARRIER_SIZE_TOL = 5%(含祖先 scale,getBoundingClientRect 测量天然覆盖祖先变换)。

速度测量基于 getBoundingClientRect(x/y 取中心、z 取宽比),因此祖先 wrapper 的变换自动计入——这解释了为什么目录反复强调"模糊 wrapper、不模糊子元素":wrapper 级测量与 wrapper 级动效是一体的。ledger.json 每行一条接缝:cut(主时钟秒)、axisx/y/z)、dir(符号,z +1 = push、z −1 = pull)、selector(承载接缝运动的元素,用 probe 命令定位)、entry.scanRoot(z 接缝的符号扫描子树)。 stamped 接缝"按构造通过门禁",手写的 Tier-A morph/match-cut 才需要人工保证。

九、与上游/下游文档的边界

  • 定律层(向量定律、电流、台账、"运动必须干活不许闲置摇摆"、climax 前的静止帧)在 motion-doctrine/SKILL.md,本文档只实现它的参数与机械。
  • 渲染正确性层(#root 不透明底色防白闪、injector 如何给两个 clip wrapper 制造重叠窗口、__OLD__/__NEW__/__T__/__DUR__ token 表、track 0/1 ping-pong)在 seam-craft/SKILL.md
  • 本目录是 .agents/skills/ 下仓库原生(repo-native)技能集的一部分,与 changelog-video 等五个依赖技能(motion-doctrinecut-the-curvecaptions-overlayseam-craftoversized-cursor)共同构成周更 changelog 视频的转场路由图,见 skills README。注意 .claude/skills/ 是字节级镜像副本,两处需同步维护(CI 有 scripts/check-skill-mirror.mjs 检查)。

十、小结:从目录到门禁的一条工作流

  1. 按第一节判定表为每个边界选型(默认 cut-the-curve 顺电流;payoff 才花 inverse zoom;同表面状态互换才用 rack-focus)。
  2. 按第二、三节锁定 Z 符号与分层模糊值。
  3. gsap-implementation.md 复制对应 worker/registry 模板,参数在第一、六节范围内微调。
  4. ledger.json 记录每条接缝的 axis/dir/selector,seam-stamp.mjs 生成主时间轴接缝块,seam-gate.mjs verify 在渲染前把关:exit/entry 仍在运动、方向与台账一致、速度比 ≈1、零重叠、z-sign-scan 无冲突、载体矩形连续。
  5. 对"脚本查不了的"(编辑重开接缝、VO 重排、clip-gating 陷阱)遵守 motion-doctrine 的人工复核规则。

这套目录的价值在于:它把"电影感"从经验审美拆解成了可参数化、可复制、可自动校验的工程约束——每一条"不要做"背后都对应一个 seam-gate.mjs 里的具体判定,或一段可直接落地的 GSAP 代码。

登录后查看全文
热门项目推荐
相关项目推荐