用途
droste-zoom 用于在 Tella 中制作无限递归(Droste)缩放效果:一个镜头内包含下一镜头的缩小副本,副本位于相框、照片打印、屏幕或窗口之中。相机以平滑的指数速率推进,画框逐渐放大直至充满屏幕,然后下一镜头接续,并可继续内嵌自己的画框,如此层层嵌套。每个层级都是按全画布尺寸绘制的真实镜头,缩放后填入上一层的窗口,因此内层镜头就是真实的下一镜头,而非替代品。它是“穿越缩放”转场的递归版本。
主要能力
- 过渡:镜头 A 的相框内嵌镜头 B(如照片滑入,或屏幕、窗口已经存在),推进穿过画框后由 B 继续作为下一片段,典型长度 3–3.5 秒。
- 链条:A → B → C 一次连续推进,例如应用 → 录屏 → 章节卡,典型长度 4–5 秒。
- 循环:一个场景包含自身,缩放永不结束,每一步无缝重复,可选每个副本旋转几度形成螺旋,2–3 步、每步 3–4 秒。
使用方式
- 先询问:查看每个涉及镜头的画面帧,然后用 ask_form 一次性询问,所有字段预填你的选择:用途(过渡、链条或循环)、画框类型(照片打印、墙上相框、显示器或电视、浏览器或应用窗口,或用户自己的想法;开口必须与视频宽高比一致)、内层镜头(下一片段、附加图片或标题卡;循环时为场景自身)、位置(新章节第一个词之前最近的停顿处)、画框上的可选文字(仅在用户提供时使用)、循环专属的扭转角度(无,或每个副本 6–10°)与步数(2–3)。
- 几何设置:窗口 {x, y, w} 的比例 r = w / canvasWidth,高度必须恰为 r × canvasHeight;r 取 0.36–0.5,越小越显纵深但需要更多层级。固定点 c = (x / (1 − r), y / (1 − r))。层级 k 的锚点为 c,缩放为 (1/r)^(depth − k);过渡的 depth 从 0 到 1,三镜头链条从 0 到 2,循环为 (time mod T) / T。链条中每个镜头的窗口应放在相同位置和大小,使一个固定点适用于每一步。
- 在 Tella Motion 中构建:每个层级一个组 L0、L1…,均按画布像素全尺寸绘制,并带层级前缀(如 L1_bg、L1_cap)以便修补;最底层节点为全画布背景以精确覆盖上层窗口。绘制顺序为 L0 在最下、更深层级在上,必要时用 node.move 修正。先设锚点,再把缩放绑定到 pow(1/r, subtract(depth, k))。过渡和链条用 setCurve 的 depth 表达式(每步一次 smoothstep 并求和);循环用匀速、无缓动的 depth。圆角窗口需为每层添加角部遮盖路径,透明度绑定为 clamp((k + 1 − depth) / 0.12, 0, 1)。螺旋需把画框艺术放入以 c 为锚点的子组并绑定旋转为 twist × (k − depth),L0 背景需超出画布。每层设置 setMotionBlur,shutterAngle: 30、local: true。
- 放置与对 speech 计时:过渡时在片段 A 最后 D 秒添加 b-roll(transitionStyle: "hardCut"),内部 L0 从该时刻播放 A 的源、L1 从 0 播放 B,并让片段 B 从 D 秒处开始,保证交接帧精确。缩放应放在停顿中,落在新章节第一个词上。链条或独立循环可作为 Tella Motion 片段新建或追加;循环也可作为画外音背后的 b-roll,长度等于步数 × 周期以保证首尾一致。
- 检查:用 get_filmstrip 以较大图块检查开始、进入中、稳定、缩放 25/50/75% 和落定等时刻;循环检查一步的 0、¼、½、¾ 以及 T−40ms 与 T 是否一致。再以 100–200ms 间隔的胶片条检查速度是否平滑。留意窗口边缘与内层镜头不吻合、转角缝隙、文字发软、绘制顺序错误。
适用场景
适合产品视频(应用窗口、录屏、章节卡之间的连续推进)、纪录片或访谈画面的照片打印式进入、以及循环螺旋等视觉彩蛋。循环也可作为画外音背景。
限制与注意事项
- 不要把包含各层级的“相机”组整体缩放,否则深层副本会变软;应绑定每层自身的缩放。
- 应在对数空间(指数)中缩放,避免线性关键帧带来的加速跳跃感;表达式绑定的结果才精确,循环才能完美闭合。
- 绘入组内的形状、标题和路径保留画布坐标,应按全尺寸绘制再由缩放缩小。
- dropShadow 颜色读回为 #rrggbb,会丢弃 #rrggbbaa 中的透明度;用仅阴影节点的透明度控制发光强度。
- 避免使用带可读品牌标志的素材,先检查内层镜头的画面帧。
- 上传的 4:3 素材需将基础布局设为全屏以填满���框。