《鹊桥仙》这个项目,是从一句词开始的。

七月的某个晚上,我在背古诗,背到“金风玉露一相逢,便胜却人间无数”,突然想:这两句要是有画面,应该是什么样?

然后我就没背下去了。那天晚上剩下的时间,我在纸上画了八个小方框。

后来这个项目花了我大概三个星期,其中两个星期在跟 bug 打架。

先说清楚要做成什么样:竖屏 1080×1920,六十帧,总长 78 秒,全片用粒子构成,不用任何现成素材。八句词,八幕。这个标准现在看有点不知天高地厚,尤其我用的是一台 2021 年的笔记本,风扇一转整张桌子都在震。

技术上用 Remotion 写视频。它的好处是可以拿 React 组件当画面,按帧渲染,我不用再学一套时间轴软件。粒子用 Three.js 加自己写的 shader,五万多个点,全部在 GPU 上算。

第一个坑来得很快:闪烁。

我渲了一个十秒的小样,播放的时候画面像信号不好的电视,一闪一闪。查了很久,原因是我在动画里用了 Math.random()。Remotion 渲染时是多进程按帧算的,每一帧都重新执行一次组件,随机数每次都不同,所以粒子位置一直在跳。

解决办法很土:所有随机数用固定种子生成,所有动画只读当前帧号。改完以后同样的代码渲两次,出来的文件一模一样。

第二个坑是字体。

我想要的落款是毛笔字。字体文件放在网上,渲染的时候浏览器去加载,有时候还没加载完就截帧了,那一帧的字就是空的。这个 bug 特别阴——一百帧里可能只有两帧是空的,不逐帧看根本发现不了。后来我把用到的几个字单独做成子集,直接内嵌,才稳定。

第三个坑不是技术问题,是时间。

终稿渲了四小时二十分钟。那天是周六,我从下午两点开始渲,渲到六点多。中间电脑热得我不敢走开,把风扇对着它吹,还开了个温度软件盯着,最高到过九十一度。我妈进来看了一眼,说你这电脑是不是要炸了。

渲完是一个 320MB 的文件。我拖进播放器,从头看到尾,看到“两情若是久长时”那一幕,粒子从两边往中间聚,聚成一座桥,然后又散掉。

那一刻挺爽的。虽然第二天我发现第七幕有个转场硬了两帧。

这个作品不算完美。分镜有几处我想重做,粒子在暗部还是有点脏,结尾的印章位置偏了一点点。但它是我第一次把一首词从头到尾变成画面,从“想”到“能播”。

现在它在小站的项目页里。有人点开看完,我就挺高兴。