Seam Craft — 场景过渡的渲染前提条件
这是 PLV 场景间过渡的渲染正确性规范:使得任何过渡都能正确合成的前提条件和主时间线机制,与具体选择哪种过渡无关。具体过渡的目录(交叉淡入淡出、推拉滑动、缩放通过、切曲线等)位于过渡注册表中——此页面是支撑所有过渡的底层规范。
本规范所涵盖的过渡均为 Tier-B 就绪:仅在两个场景剪辑包装器(#el-<sid>)上进行纯变换/透明度/滤镜操作,不注入额外的覆盖层 DOM,无需每个场景协作。覆盖层家族(交错块、百叶窗、漏光、网格溶解、页面燃烧)和着色器过渡将推迟到后续阶段。
舞台背景前提条件(白色闪光防护)
多个模板会打开一个窗口,其中两个包装器的透明度之和 < 1(切曲线的中间窗口切、缩放通过的 0.15 底限、普通交叉淡入淡出的功率曲线下降)。在此期间,包装器后方的任何内容都会透出来。如果组装的 index.html #root 没有不透明背景,渲染器会将下降区域合成到默认的白色页面上 → 每个过渡处出现白色闪光,在暗色影片上尤为刺眼(在修复前,两次 Spotify 运行中观察到)。组装器必须绘制舞台: #root { background: var(--canvas-deep, var(--canvas, #000)) } — assemble-index.mjs 现已发出此设置;任何其他使用这些模板的消费者也承担相同的保证。
注入器如何应用过渡
在场景 i(from)和场景 i+1(to)之间的 break 边界处,注入器:
- 将
#el-<from>包装器的data-duration延长duration_s(保持其最后一帧 — 已验证:core/src/runtime/init.ts:1393-1410外部槽分支)。 - 将
#el-<to>包装器的data-start提前duration_s(创建重叠窗口)。 - 将所有剪辑的
data-track-index重新分配为 0/1 ping-pong,以便两个重叠的包装器永远不会共享同一个轨道(同一轨道重叠是非法的 —core/src/lint/rules/composition.ts)。较高的轨道合成在顶部。 - 在
T = overlap-start处将gsap_template注入window.__timelines["main"]。
由原型渲染验证(2026-05-31):主时间线包装器补间被查找并渲染(不会与子合成的暂停时间线双查找——运行时独立驱动它们),扩展的包装器保持场景 i 的最后一帧,较高轨道的进入包装器合成在上方并与离开包装器混合。
模板占位符
注入器会在每条 gsap_template 行中替换以下标记:
| 标记 | 含义 |
|---|---|
__OLD__ | "#el-<from>" — 离开剪辑包装器选择器(带引号) |
__NEW__ | "#el-<to>" — 进入剪辑包装器选择器(带引号) |
__T__ | 重叠开始时间(秒,主时钟) |
__DUR__ | 此边界的 duration_s |
__DX__ | 方向类型的水平移动:-1920(向左)/ 1920(向右) |
__DY__ | 垂直移动:-1080(向上)/ 1080(向下) |
__ORIGIN_OUT__ / __ORIGIN_IN__ | squeeze 的 transformOrigin 对 |
filter / scaleX / transformOrigin 在主时间线上符合 lint 规范(已验证:core/src/lint/rules/gsap.ts 没有按属性白名单,并将其检查限定在 data-composition-id 范围内; x/y/scale/rotation/opacity 白名单仅是一个 scene-worker 提示规则——它不绑定 index.html)。