HyperFrames 帧内接缝切镜目录:用 Zoom-Through、Inverse Zoom、Cut the Curve 与 Waterfall Cut 打造帧内连续运动
2026/9/12 15:27:34 网站建设 项目流程

HyperFrames 帧内接缝切镜目录:用 Zoom-Through、Inverse Zoom、Cut the Curve 与 Waterfall Cut 打造帧内连续运动

【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes

本文是 HyperFramesproduct-launch-video技能中帧构建(Frame Worker)的接缝切镜(seam cut)权威指南。它解决一个具体问题:当单个帧内部的镜头序列出现"接缝"——场景内文字/元素切换、Scene-to-Scene切镜(Scene帧内的一个时间窗口,不是帧与帧的边界)、或一行文字换为另一行文字时——如何让观众看到的是一次连续运镜,而不是生硬的幻灯片式硬切。读完本文,你将掌握四种由 Frame Worker 在自己的合成内部构建的速度匹配切镜技法(Zoom-Through、Inverse Zoom-Through、Cut the Curve、Waterfall Cut),理解它们与帧间transition_in转场的严格分工,并能依据模糊逻辑、相位参数、缓动曲线与反模式清单,在 cut-catalog.md 的指导下写出可复现、可验证的帧内接缝。

定位澄清:帧内接缝 ≠ 帧间转场

首先要建立清晰的边界。这份目录是worker 构建配方(构建步骤 Step 5),它是skills/hyperframes-animation/rules/的兄弟文档,而不是第二份运动文档。它所描述的切镜是帧 worker 在自己的合成(composition)内部构建的:Z 轴缩放 + 模糊 + 不透明度补间,或者逐词的 x 轴错峰,全部发生在该帧自己那条暂停的 GSAP 时间线上。

它们不是帧与帧之间的转场——帧间转场由 story 通过transition_in声明,由装配器(harness)的注入器(injector)从一套独立的注册表词汇盖章生成:crossfade/blur-crossfade/push-slide/zoom-through/squeeze。因此,本目录中的命名(cut-the-curve / inverse-zoom / waterfall不是合法的transition_in取值——在 storyboard 中把它们写进transition_in会导致转场注入器找不到注册表记录而回退到默认值(见下文源码分析)。

何时使用本目录:当帧的镜头序列存在内部接缝——场景内的文字/元素切换、Scene-to-Scene 切镜(Scene单个帧内部的时间窗口,不是帧间边界)、或文字换行的文本切换——并且你希望它读起来像一次连续移动而不是生硬的幻灯片硬切时。注意zoom-through同时存在于两个世界:在注册表中它是整帧包裹层转场,在这里它是元素级 Z 轴切镜——同样的思想,不同的作用域。

四种技法:同一个底层原理

本目录给出四种制造纵深与连续性的技法:

  1. Zoom-Through— 场景内文字切换,Z 轴,朝观众方向移动
  2. Inverse Zoom-Through— Z 轴切换,朝远离观众方向移动
  3. Cut the Curve— x/y 轴上的场景间转场
  4. Waterfall Cut— 逐词的 cut-the-curve,错峰退场与入场

四种技法共享同一个底层原理:在峰值速度处切割(cut at peak velocity),并匹配切割两侧的方向与速度。差异只在于轴(axis)、作用域(scope)与粒度(granularity)。

如何在一个接缝处做选择

  • 未完成的短语(正在跨多个视觉上不同的场景构建同一个更大的观点——多行文字、连续的一系列卡片):用cut-the-curve/waterfall
  • 状态变化(转向视频的新部分——最常见的是 hook → context,或两个独立章节之间):用zoom-throughinverse zoom-through用于到达/回报节拍(arrival / payoff beat)。
  • 将这些技法串联起来,让帧内部的接缝感觉像一台摄像机在整个内容中连续移动。

模糊逻辑(适用于所有 Z 轴变体)

模糊用来"卖"切割瞬间的速度,但它必须随主体尺寸缩放

主体峰值模糊原因
文字级(标题、行、词组)10px20px 时文字糊成一团无法辨认——眼睛会丢失正在追踪的词,切割读起来像故障(glitch)而不是速度。(2026-06-10 的经验教训:此前的 inverse zoom 以 20px 交付,显得糊软;10px 能在切割中途保持字母形状可读。)
整帧表面(终端窗口、卡片、截图)18–20px大表面有边缘和纹理可以承受重度模糊;整帧移动上的较轻模糊读起来像渲染小故障而不是运动。

两个硬性规则:

  • 切割两侧使用相同的峰值模糊——值必须在交换帧处匹配。
  • 模糊应用在 Wrapper 上,绝不应用到单个子元素上

1. Zoom-Through(正向)

问题

文字进入、停留、退出。然后下一段文字进入、停留、退出。每段文字块相互独立——没有纵深,没有连续性。视频感觉像幻灯片。

原理

Z 轴上的速度匹配切割。你永远不会同时看到两段文字。退出的文字向观众方向缩放(加速),模糊和不透明度在切割点达到峰值并隐藏一次硬交换,进入的文字从背后继续放大(减速进入焦点平面)。一次连续的前向运动,两段不同的文字。

三个阶段

阶段 1:退场(Exit)—— 文字向前加速(朝向观众)

  • Scale:1.0 -> 1.2,Blur:0px -> 10px(文字级;见模糊逻辑),Opacity:1.0 -> 0.15
  • 缩放/模糊缓动:power3.in(陡峭加速)
  • 不透明度缓动:none(线性——均匀变暗,与缩放分离)
  • 时长:0.2s

阶段 2:硬切割—— 在峰值速度 + 峰值模糊处

  • 退场方:opacity: 0(通过tl.set瞬时设置)
  • 入场方:opacity: 0.15, scale: 0.75, blur: 10px(通过tl.set瞬时设置)
  • 所有属性在切割处匹配:模糊、不透明度、以及缩放的方向(双方都在放大)

阶段 3:入场(Entry)—— 文字继续向前(生长进入焦点平面)

  • Scale:0.75 -> 1.0,Blur:10px -> 0px,Opacity:0.15 -> 1.0
  • 缓动:expo.out(与退场速度匹配的陡峭初始爆发,长尾沉降)
  • 时长:0.5s

为什么退场时的不透明度必须分离

缩放使用power3.in,但这会让不透明度在补间的大部分时间里保持在接近 1.0。把不透明度拆成自己的补间并使用线性缓动,可以让变暗均匀。入场时,所有属性可以共享expo.out

2. Inverse Zoom-Through(反向)

镜像版本:摄像机是"向后拉"而不是"向前推"。退场的元素远离观众退去;入场的元素以超大尺寸抵达(仿佛它刚刚就在摄像机后面),然后收缩进入焦点平面。两者都向缩小方向移动——同向规则保留,只是反转了。

何时用它替代正向变体:到达节拍。入场元素因为从超画幅而来而带有存在感——正适合一句 payoff 台词("That changes today.")、一个巨大的回复、或一个保持的终态。正向 zoom-through 读起来像在内容中前进;反向读起来像抵达内容。

三个阶段

阶段 1:退场—— 元素退去(远离观众)

  • Scale:1.0 -> 0.8,Blur:0px -> 10px(文字级)
  • 缩放/模糊缓动:power3.in;不透明度:1.0 -> 0.15使用none(独立补间)
  • 时长:0.2s

阶段 2:硬切割

  • 退场方:opacity: 0通过tl.set
  • 入场方:opacity: 0.15, scale: 1.25, blur: 10px通过tl.set

阶段 3:入场—— 入场元素收缩归位

  • Scale:1.25 -> 1.0,Blur:10px -> 0px,Opacity:0.15 -> 1.0
  • 缓动:expo.out,时长:0.5s

已交付示例boring → until-nowB3 → "That changes today."(sfx-music-launch);editorial-paper 的第 3/4 处接缝(follow-up → thinkingthinking → compose UI)。

3. Cut the Curve(场景转场)

原理

在 x 和 y 轴上为所有场景间转场使用 cut-the-curve。退场场景的主角元素朝一个方向加速,切割落在运动途中,入场场景的主角元素继续朝同一方向移动并减速。没有元素完全移出画面,也没有元素从完全画外进入——速度加不透明度渐隐骗过眼睛;局部移动已经足够。

同路径、同方向

如果场景 A 的主角向左滑出,场景 B 的主角从右侧进入并继续向左滑动。两者都向左移动。一次连续的运动。

方向场景 A 退场场景 B 入场起点场景 B 入场终点
向左x: 0 -> -230x: +230x: 0
向右x: 0 -> +230x: -230x: 0
向上y: 0 -> -230y: +230y: 0
向下y: 0 -> +230y: -230y: 0

通过镜像缓动实现速度匹配

最干净的匹配:退场用power4.in、入场用power4.out,且距离与时长相同——数学上它们是一个power4.inOut复合曲线的两半,因此入场元素恰好在一个虚拟路径的 50% 处、以完全相同的速度接续(例如 230px / 0.3s ≈ 切割两侧各 3,070 px/s)。

渐隐技巧:退场方的不透明度在约 25–30% 的行程处完成(渐隐时长 ≈ 0.18–0.3s,运动时长 0.3–0.34s)——元素在仍然明显加速时消失,没有任何东西需要抵达画面边缘。入场方在减速过程中从约 0.35 开始快速淡入。让最后一个渐隐元素恰好在硬切割处消失——中间没有东西在移动的间隙读起来像尴尬的死寂(dead air)。

规则

  • 所有场景转场都使用 cut-the-curve——它是默认值,不是点缀
  • 两侧同方向;镜像的.in/.out缓动,同样的距离 + 时长
  • 退场时长要短(0.2–0.4s),入场时长 >= 退场时长
  • 局部移动 + 渐隐,绝不全程移出画面

4. Waterfall Cut(逐词版 cut-the-curve)

粒度上的 cut-the-curve——向左切割对文字到文字接缝的最强版本。退场行的每个词沿着自己明显的曲线 ramp 出去;入场行的每个词在飞行途中级联进入。错峰把切割变成一道让眼睛跨过接缝的波浪。

退场(逐词)

  • 运动:x: 0 -> -230,时长 0.34s,power4.in—— 比通常的 power2 明显更陡的 ramp:词几乎不动,然后猛然加速(RIPS)
  • 渐隐:opacity -> 0,时长 0.18s(独立补间,power1.in)——在词只走了约 25–30% 行程时完成
  • 错峰:按阅读顺序,每词约 0.022s,计时使得最后一个词恰好在硬切割时完成渐隐

入场(逐词)

  • fromTo x: +230 -> 0, opacity: 0.35 -> 1,时长 0.3s,power4.out—— 复合曲线的镜像后半段;每个词点燃时已经在以匹配速度移动
  • Waterfall 错峰使用递减的间隔(起点 0.05s,每词乘以约 0.84)——级联应该跨行加速,而不是使用扁平逐词延迟
  • 在构建时把所有词预置为x: +230, opacity: 0—— 仅靠immediateRender: false会让尚未开始的词在错峰窗口期以静止状态可见地停留在原地

整行变体

一个单行节拍(例如一行大标题)作为一组以同样的明显 ramp 退出,但把渐隐拉长到约 0.3s、并在切割前约 0.02s 结束——一个提前渐隐的孤立元素会留下词级联原本可以覆盖的死寂。

已交付示例until-now.html的 B1→B2→B3(sfx-music-launch)。

变体选择矩阵

Zoom-ThroughInverse ZoomCut the CurveWaterfall Cut
作用域场景内文字切换到达/回报节拍场景之间文字到文字接缝
Z,朝向观众Z,远离观众X / YX,逐词
峰值模糊文字 10px / 整帧 20px文字 10px / 整帧 20px无需无(渐隐完成工作)
切割处不透明度0.150.15切割时已渐隐最后一词在切割处消失
观感穿越内容抵达内容被横向带走一道跨过接缝的波浪

反模式清单

不要为什么应该
zoom-through 期间两段文字同时可见重叠文字破坏 Z 轴错觉在模糊峰值处硬切,一次只有一段文字
文字级主体用 20px 模糊字母形状糊掉;读起来像故障文字用 10px,只有整帧用 18–20px
跨切割的元素走不同路径眼睛追踪一个方向,切割走另一个同一属性,同一方向
交换处模糊/不透明度不匹配可见闪烁或亮度跳跃切割帧处使用完全相同数值
入场用温和缓动(power2.out入场速度感觉比退场慢镜像退场:power4.out/expo.out
完全移出/移入画面浪费时间并破坏速度错觉局部移动 + 提前渐隐
孤立元素在切割前很久就渐隐接缝处死寂渐隐在切割前约 0.02s 结束,或使用词级联
正文文字上做 zoom-through0.75 缩放的小文字无法阅读只用于标题和短短语
场景切割不用 cut-the-curve静态切割感觉像幻灯片cut-the-curve 是默认值

源码佐证:两套体系在仓库中的落点

帧间转场注册表:transitions.json

帧间转场由 transitions.json 中的注册表驱动,其中zoom-through的 GSAP 模板是:

tl.to(__OLD__, { scale: 2.5, opacity: 0, filter: "blur(8px)", duration: __DUR__, ease: "power3.in" }, __T__); tl.fromTo(__NEW__, { scale: 0.5, opacity: 0, filter: "blur(8px)" }, { scale: 1, opacity: 1, filter: "blur(0px)", duration: __DUR__, ease: "power3.out" }, __T__);

注意它与本文目录中元素级 zoom-through 的关系:同样的思想(退场加速放大 + 模糊 + 渐隐,入场从背后继续放大)、不同的作用域——注册表作用于两个帧 clip wrapper(#el-<id>),而本目录作用于帧内部 paused GSAP 时间线上的元素。注册表还定义了crossfadeblur-crossfadepush-slidesqueeze,以及两个默认值:高能量默认zoom-through、平静默认blur-crossfade,并限制最大转场时长 2.0s。

注入器:transitions.mjs

transitions.mjs 是注入与验证脚本。关键行为:parseTransitionIn只接受注册表内的类型名(crossfade/blur-crossfade/push-slide/zoom-through/squeeze,可选<DIR>方向与<N>s时长);遇到不在注册表中的类型时,resolveRecord会回退到default_calm并打印警告——这正是为什么cut-the-curve这类目录命名不能写进transition_incut/none/ 空值则直接表示硬切(无重叠、不盖章)。注入采用 EXTEND-OUTGOING-ONLY 机制:只延长退场方 wrapper 的data-duration保持其末帧跨过重叠窗口,不移动任何data-start,入场方从更高的轨道上叠入,随后对所有 clip 做 0/1 ping-pong 轨道分配并盖章 token 替换后的 GSAP 模板。verify子命令作为确定性门禁,检查每个转场边界均有重叠、跨轨道、且注入块引用了两侧 id。

运动原则:motion-language.md的运动法则第 4 条

motion-language.md 的运动法则(Motion Doctrine)第 4 条明确要求:当帧存在内部接缝时,做成速度匹配切镜,而不是幻灯片式硬切——在峰值速度处切割,匹配两侧方向与速度,并指向cut-catalog.md。同文档 Part 3 的 seek-safe 硬规则同时约束了实现方式:所有运动必须驱动在暂停的 GSAP 时间线内(禁止 CSStransition/@keyframes),入场必须使用fromTo显式声明 from 状态,禁止无限运动与随机性,且帧内接缝不是帧的退场——帧的退场由 harness 注入的transition_in承担。

Worker 角色:frame-worker.md

sub-agents/frame-worker.md 定义了 product-launch 工作流的帧 worker 增量角色。worker 每次只处理一个帧,读到的角色由核心契约(frame-worker-core.md)加上本文件拼接而成。跨帧边界有硬性交接契约:若 packet 含handoff_in:/handoff_out:,必须按给定数值开始/结束命名元素(x/y 位置、缩放、不透明度、运动方向/速度),字段即使声明为"不变"也具有约束力——相邻帧由另一个 worker 并行构建,会用匹配值。这保证了接缝处不会出现两个 worker 各自发明不同版本的同一条接缝。

在 6 步工作流中的位置

在 SKILL.md 的完整工作流中(Step 0 setup → Step 1 capture → Step 2 design system → Step 3 storyboard/script → Step 4 visual design → Step 5 frames → Step 6 render),本目录服务于Step 4 与 Step 5:Step 4 在写时间码镜头序列时按motion-language.md的词汇命名接缝(zoom-through / inverse zoom-through / cut-the-curve / waterfall cut,均指向cut-catalog.md),Step 5 由帧 worker 依据该目录在每帧的暂停时间线上实际构建。Step 6 的transitions.mjs inject/verifynpx hyperframes lintchecksnapshot则负责在最终渲染前验证包括接缝在内的所有运动(对每个切割点前后 ±0.1s / +0.2s 截图比对,确认延续元素的位置、缩放、不透明度与方向无跳变)。

结语:让帧内的接缝成为同一次运镜

四技法、模糊逻辑、相位参数与反模式清单共同构成一套自洽的帧内接缝语言:无论接缝是场景内文字切换、场景间换场还是逐词换行,原则始终是——在峰值速度处切割,匹配两侧方向与速度,用模糊卖速度、用不透明度藏交换、用错峰把切割变成波浪。把这套语言与帧间transition_in注册表词汇严格区分开,按 cut-catalog.md 的相位参数逐项实现,再用transitions.mjs verifysnapshot做确定性校验,你就能让视频的每一次内部接缝都读作"一台摄像机穿行于内容之中",而不是幻灯片翻页。

【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询