news 2026/9/9 13:50:38

HyperFrames halftone-dissolve 组件:基于种子阈值场的点阵溶解转场原理与实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HyperFrames halftone-dissolve 组件:基于种子阈值场的点阵溶解转场原理与实战

HyperFrames halftone-dissolve 组件:基于种子阈值场的点阵溶解转场原理与实战

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

HyperFrames 是"Write HTML, Render video"的开放视频框架,它的 registry 中收录了大量可复用的 HTML 视频组件,而halftone-dissolve正是其中一款面向转场/纹理场景的过渡图元:场景 A 通过一个不断扩张的半调(halftone)点阵"溶解"进场景 B,网点以"最小优先"的顺序在固定错排网格上以强调色弹出,随后每个网点开启一扇通向 B 的圆形窗口,直至窗口合并、B 完全取代 A。读完本文,你将掌握该组件的安装、双场景插槽装配、五个配置变量的取值语义,以及它如何借助固定种子 LCG 阈值表和单一进度补间实现逐帧可复现的确定性渲染。

核心文档位于 registry/components/halftone-dissolve/README.md,完整实现见同目录下的 halftone-dissolve.html,本文结合源码逐行展开。

效果与设计目标

从视觉呈现来看,这一转场是一个"墨水扩散"过程:

  • 网点先以强调色(accent ink)出现在固定网格格点上,按阈值顺序最小优先生长;
  • 每个墨点"领先一拍"地开启一扇窗口,露出其后的场景 B——即每个格点先闪现强调色,再被 B 填满;
  • 窗口最终合并覆盖全屏,clip-path释放,B 完全静止展示。

每个网点的半径是**(网格位置, 进度 p)的纯函数**,由种子阈值表(seeded threshold map)驱动,方向枚举(direction)决定阈值的读取顺序。该组件默认内置 3.5s 时长、在 B 上以"弹性 HOLD"结尾(永不做 time-scale)。

概念澄清:这里的A/B 场景都是插槽(slot),不是组件内固定的图片素材。调用方只需要在宿主页面任意位置放两个惰性<template>,运行时会把内容搬进场景层;缺省时组件会用纯设计令牌绘制的"字母牌"占位(A 用中性色,B 用强调色),这一点在源码注释(halftone-dissolve.html 第 11-20 行)和 registry-item.json 的type: "hyperframes:component"family: "transitions"profile: "texture"元数据中均可印证。

组件元数据还给出了它的定位:jobs: ["bridge"](桥接两段画面),tagsmotion-primitive / transition / texture / halftone / dissolve,并声明了唯一同步点syncPoints: [{ id: "dissolve", phase: "in", offset: 1.1 }],即溶解在 1.1s 处触发——这部分与运行时的事件对齐(如为音效打点)直接相关。

安装与目录产物

该组件通过 HyperFrames CLI 的 add 子命令安装:

npx hyperframes add halftone-dissolve

CLI 的用法表在 docs/developers/cli.mdx 中登记为 "Add a Catalog item:npx hyperframes add <name>"。命令会写入一个文件:

compositions/components/halftone-dissolve.html

在仓库内,组件源文件位于 registry/components/halftone-dissolve/halftone-dissolve.html,随附的 registry-item.json 中files[0]记录了发布目标路径compositions/components/halftone-dissolve.html,与 CLI 行为一致。

安装后可把它粘贴进自己的 composition——组件本身没有自己的尺寸和时长,二者都取自你所粘贴进的 composition。目录页 docs/catalog/components/halftone-dissolve.mdx 中同样说明了这一用法,并指出"每个变量都有默认值,不设置任何参数也能原样工作"。

在宿主页面中挂载

READ ME 给出的最小挂载结构是把组件当作宿主页面中的一个.clip元素:

<div class="clip" ><template><template><div >var duration = ...parseFloat(root.dataset.duration || "3.5"); var OUT = exit === "none" ? 0 : 0.45; // 可选离场 0.45s var DISSOLVE = Math.min(1.3, Math.max(0.4, duration - OUT - 0.6)); // 溶解恒 ≤1.3s var maxAt = Math.max(0.2, duration - DISSOLVE - OUT - 0.05); var dissolveAt = num(vars.dissolve_at, 1.1, 0.2, maxAt); // 钳制到 maxAt 内 var OUT_START = duration - OUT;

实际时间线由三条 GSAP 结构组成:

  1. 一条锚点补间tl.to({t:0},{t:1, duration, ease:"none"},0)横跨整个创作时长,目的是让onUpdate画图在 [0, D] 内任何一次"事件式 seek"都被触发,同时让 HOLD 段保持tl.time()诚实;
  2. 一条进度补间tl.fromTo(P, {p:0},{p:1, duration:DISSOLVE, ease:"power1.inOut"}, dissolveAt),这是溶解本体的唯一驱动——power1.inOut让前锋两端都不仓促(最小优先地弹出、不勉强的合并);
  3. HOLD 不写任何补间;仅当exit非 none 时,在OUT_START追加 0.45s 的power2.in离场(up同时上移-4cqh与淡出,fade仅淡出)。

整条时间线paused: true,最后tl.seek(0); paint()后注册到window.__timelines["halftone-dissolve"],等待帧适配器逐帧 seek——这正符合 HyperFrames 的确定性模型(见下节)。

确定性渲染原理

README 的 Determinism 一节是理解该组件工程价值的关键:

网格与其阈值表在构建时用固定 LCG 种子只计算一次;一个普通对象的进度补间喂给唯一一个画师,该画师从零重绘墨点画布、并重建 B 的clip-path字符串——全部是 progress 的纯函数。因此任意顺序、任意方向的事件式 seek 都会落在完全相同的帧上。栅格与 clip-path 的基准是挂载时测量一次的宿主盒子

映射到源码(halftone-dissolve.html):

  • 固定种子 LCGvar state = 0x4a17f03d;随后state = (Math.imul(1664525, state) + 1013904223) >>> 0;(第 273-277 行)。这是标准的 Numerical Recipes 线性同余生成器参数,种子是硬编码常量,保证每次运行产生同一张抖动/散列序列;
  • 只在构建时计算一次:网格生成在一个 IIFE 中完成,阈值th由方向决定的基础量(center用到中心的归一化距离、noise直接取next()、否则用x/cssW)叠加种子抖动((next()-0.5)*0.22)并乘以0.62归一化后写入点表;
  • 半径是 (位置, 进度) 的纯函数windowRadius(dot,p) = R_MAX * smooth(clamp01((p - dot.th)/0.38))inkRadius则把进度前移0.07,实现"墨点领先窗口一拍"(第 310-315 行);smooth()即三次平滑v²(3-2v)
  • 单一画师onUpdate: paint每帧清空墨点画布、按点表填充墨点圆,并逐点拼出M..A..A..Z的 clip-pathpath()字符串赋给.htd-scene-b(第 330-382 行)。lastClip缓存仅用于跳过字符串相同的样式写入,绝不用于跳过变化帧的重绘
  • 没有Math.random()时序依赖:所有随机性来自种子 LCG;渲染逐帧 seek、不"播放",因此无论 seek 方向与顺序如何,帧内容都确定。

这一节也是整个框架"Same input, identical output"保证的一个实例化:框架级约定(无墙钟、无未播种随机、无渲染中途 fetch、帧锁定 fps/宽/高)记录在 docs/concepts/determinism.mdx,每次渲染逐帧seekFrame(frame)、GSAP 时间线一律暂停并 seek(见 docs/concepts/frame-adapters.mdx)。对 halftone-dissolve 而言,这意味着它的所有伪随机视觉都由0x4a17f03d这一个种子决定——任何对"抖动排布"的视觉调整,本质上都要回到种子与dot_size网格密度这两处。

其他网格与分辨率要点

  • 经典半调错排x = (c + (r%2===0 ? 0.25 : 0.75)) * cell(第 282 行),交替行错开半格,正是经典 halftone 交错的网格形态;行数/列数各多算 1-2 个以保证边界无洞。
  • 最大半径R_MAX = cell * 0.78,使相邻圆在满覆盖时互相重叠,从而实现窗口合并后的无缝全屏。
  • 栅格基准与 DPR:画布物理分辨率 = CSS 尺寸 ×min(2, max(1, devicePixelRatio))cssW/cssH与 clip-path 的坐标系统一来自挂载时一次性测量getBoundingClientRect()(缺省回退 640×360),避免逐帧测量导致的不确定性。

快速对照:仓库文件速查

文件(仓库根相对路径)作用
registry/components/halftone-dissolve/README.md组件权威说明:挂载、插槽、变量、编排、确定性
registry/components/halftone-dissolve/halftone-dissolve.html完整实现:CSS、插槽解析、LCG 点表、GSAP 时间线、单画师
registry/components/halftone-dissolve/demo.html1920×1080 浅色主题宿主,示范非默认变量 + 双插槽装配
registry/components/halftone-dissolve/registry-item.json目录元数据:标签、family/profile、同步点、变量 schema
docs/catalog/components/halftone-dissolve.mdx站点目录页:安装命令、变量表、完整源码展示
docs/concepts/determinism.mdx框架级确定性渲染规则背景
docs/developers/cli.mdxnpx hyperframes add等 CLI 用法

小结

halftone-dissolve演示了 HyperFrames 组件设计的一整套惯用法:无自持尺寸与时长、内容走宿主插槽、外观全部消费设计令牌、时间线固定段 + 弹性 HOLD、随机性收敛到单一固定种子。安装后你只需要做三件事——把它的 HTML 内容并入 composition、按需在元素上覆盖dot_size / direction / dissolve_at / accent / exit、再在宿主里给出 A/B 两个场景模板——即可获得一段对逐帧渲染完全确定的半调点阵溶解转场;若在 dissolve 触发的 1.1s 时间点有音效需求,可直接对齐它声明的dissolve同步点。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 13:50:31

最短路径-Dijkstra

算法设计解决2个问题如何存放最短路径长度:用一维数组dist[j]存储!源点v默认&#xff0c; dist[j]表示源点 中顶点j的最短路径长度。如dist[2]12表示源点中顶点2的最短路径长度为12。如何存放最短路径:从源点到其他顶点的最短路径有n-1条&#xff0c;一条最短路径用一个一维数组…

作者头像 李华
网站建设 2026/9/9 13:50:14

用Hashids隐藏自增ID:C端接口防枚举与防泄露实践

做了几年 C 端后端&#xff0c;有个问题几乎每次评审都会被翻出来——接口里直接返回自增 ID。用户 ID 是 1、2、3&#xff0c;订单号是 10001、10002&#xff0c;看一眼 URL 就知道平台体量有多大&#xff0c;改一下参数就能遍历别人的数据。你跟他讲性能&#xff0c;他说我就…

作者头像 李华
网站建设 2026/9/9 13:49:35

从形式合规到实质安全:企业网络安全合规自查体系落地指南

1. 为什么你家的合规自查&#xff0c;总是“查了个寂寞”做网络安全这些年&#xff0c;我接过不少企业的安全咨询&#xff0c;也帮好几家公司搭过内部的合规自查体系。每次开场沟通&#xff0c;对方都会拿出一堆材料&#xff1a;各种制度文档、培训记录、漏洞扫描报告、渗透测试…

作者头像 李华
网站建设 2026/9/9 13:45:19

Python量化交易学习指南:从环境搭建到双均线策略回测

简介&#xff1a;这是一份面向量化交易入门者的Python学习代码示例集&#xff0c;聚焦股票、ETF与概念板块的数据处理及策略分析场景&#xff0c;适合希望用Python将金融数据转化为可执行策略的初学者参考。资源共253个文件&#xff0c;以106个py脚本为核心&#xff0c;配套132…

作者头像 李华
网站建设 2026/9/9 13:37:04

从ECC原理到MBIST自检:服务器内存报错排查指南

开机自检卡在POST界面&#xff0c;屏幕上孤零零地挂着一行“uncorr. ECC 显示2”&#xff0c;系统怎么也不肯进系统。如果你运维过服务器&#xff0c;大概率对这个画面不陌生。我见过不少同事第一反应就是“内存坏了&#xff0c;赶紧换”&#xff0c;结果换了三四根还是报错&am…

作者头像 李华
网站建设 2026/9/9 13:37:03

STM32嵌入式Web服务器开发实战:从LwIP到HTTP协议实现

简介&#xff1a;STM32实现Web服务器是面向嵌入式开发者和物联网初学者的实战资料&#xff0c;以STM32微控制器与轻量级LwIP协议栈为核心&#xff0c;完整演示在资源受限的MCU上完成以太网接入、TCP/IP通信搭建&#xff0c;并对外提供HTTP服务&#xff0c;解决单片机联网难、We…

作者头像 李华