HyperFrames 中的 Cut the Curve 转场技法:五类接缝与两项场景内动效的参数化实现
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.inOut、slow()) |
§7 三阶段链 |
| Nudge tail 短于 ramp-in 的 3 倍 | 延长 tail 的时间,不是距离 |
八、Seam Gate:把目录变成可校验的构建门禁
目录里"verify per Seam Gate rule 7"不是口头约定——仓库提供生成+校验脚本对 seam-stamp.mjs 与 seam-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 = 3(seam-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(主时钟秒)、axis(x/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-doctrine、cut-the-curve、captions-overlay、seam-craft、oversized-cursor)共同构成周更 changelog 视频的转场路由图,见 skills README。注意.claude/skills/是字节级镜像副本,两处需同步维护(CI 有scripts/check-skill-mirror.mjs检查)。
十、小结:从目录到门禁的一条工作流
- 按第一节判定表为每个边界选型(默认 cut-the-curve 顺电流;payoff 才花 inverse zoom;同表面状态互换才用 rack-focus)。
- 按第二、三节锁定 Z 符号与分层模糊值。
- 从 gsap-implementation.md 复制对应 worker/registry 模板,参数在第一、六节范围内微调。
- 用
ledger.json记录每条接缝的 axis/dir/selector,seam-stamp.mjs生成主时间轴接缝块,seam-gate.mjs verify在渲染前把关:exit/entry 仍在运动、方向与台账一致、速度比 ≈1、零重叠、z-sign-scan 无冲突、载体矩形连续。 - 对"脚本查不了的"(编辑重开接缝、VO 重排、clip-gating 陷阱)遵守 motion-doctrine 的人工复核规则。
这套目录的价值在于:它把"电影感"从经验审美拆解成了可参数化、可复制、可自动校验的工程约束——每一条"不要做"背后都对应一个 seam-gate.mjs 里的具体判定,或一段可直接落地的 GSAP 代码。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00