第 1–5 集的 10 个亮点特效:好在哪、怎么复用、怎么改
从第 1–5 集里挑出 10 段最好看的动画,每段都重写成独立的模块,放在 src/fx/<id>.js。每个模块的 draw(c, t) 只依赖时间 t,没有隐藏状态,所以可以拖进度条、可以单帧截图,也可以整段搬进新一集。第 1–3 集的画风是基准;第 4 集的补觉段(nap-fall)是你点名最喜欢的,按原版的高反差还原。
怎么看:浏览器打开 fx.html,用 ?fx=<id>&t=3.5 跳到某个特效的某一秒;命令行跑 node tools/fxcheck.mjs <id> --n 12,在 out/fx/<id>.jpg 得到 12 帧联系表,页面有报错时退出码为 1。下面每张图就是这样出来的。
怎么用:index.html 里加 src/fx/_fx.js 和要用的模块,然后整段放映写 fxScene({ id: 'nap-fall', lines, over }),或在自己的画面里当零件画 fxPlay('nap-fall', c, tau, { box: [x, y, w, h], t0, speed })(可缩进某一块区域、错开时间、调速、循环)。每个文件的头注释写了出处、好在哪、复用、分叉四项,配置都在文件顶部的 FX_xxx 常量里,全局变量统一加 fx 前缀,不会和段文件冲突。
先读这一节:手书感从哪里来
10 段特效共用同一套做法。看起来像一张张手剪的纸和手写的线,靠的是下面 8 条,缺一条就容易变成矢量动画。
- 纸有厚度。每张纸的边缘多画一条 6–12 像素的深色侧边,叠起来就有立体感(冰块、地层、折叠的字条都是这样)。
- 影子只有一层、边缘是硬的。影子是同一形状向右下偏移几十像素的纯色块,不模糊、不渐变。
- 剪口带手抖。轮廓经过
cutPaper/rline,每个顶点随机偏移约 ±1.6 像素,种子固定,每帧抖得一样。 - 动作有预备、过冲、回稳。弹出的纸先往下压一点,冲过目标位置,再弹回来,最后加一个「啪」字。
- 一个场景只用一个强调色。蓝晒星图只有深蓝、纸白、一颗金星;折字游戏只有「霜」变紫。
- 段与段之间用形状接形状。月亮变盘子,桌布线拉直成轨道(见
handoffs)。不用镜头推拉。 - 透视用仿射变换。斜放的书、站起来的纸片都是
setTransform的倾斜,不用 3D 引擎,所以边缘保持剪纸的平整。 - 尺寸有下限。道具不小于画高的 15%,字不小于 48 像素(1080p),一个镜头里缩放不超过 2.5 倍。
不要烘焙光影。不画渐变光斑、体积光、柔和辉光、环境光遮蔽。第 4 集的吊灯光锥、柔光渐变是整集显得廉价的主要原因。要表达「亮」,用留白、一条白色高光线、或者「一张深色纸上挖一个圆洞」(见
puppet-stage 的聚光灯)。nap-fall 里的白剪影光晕是唯一的例外:它是第 4 集原版的招牌画面,用一层径向渐变加一圈暗角还原,限制在这一个模块里。
10 个特效
已知的小缺点
fold-bits:提示小字 60 像素,缩成联系表时偏小;翻起的半张纸用仿射近似,不是严格透视。pinwheel-tiles:左侧算式 52 像素,刚过下限;每块冰的裂纹是同样的两道。