MECHANICAL LEPIDOPTERA:影片规格书,第 4 版(先造出来,再活过来)
角色:美术指导撰写并审阅这份规格书,制作者负责实现,客户负责审批。项目:本 skill 的 example/(一个供研究的完整参考,不是模板)。动手之前按这个顺序读:先把本文件从头到尾读完;再读 ../references/determinism-and-contract.md,那是每一帧都要遵守的规矩;然后读这份规格书旁边 src/canvas-core/butterfly/ 里的模块(geom、kit、parts、plate、surface、linkage、act1cues,以及 act4* 里的终场世界)。在改动任何会影响到那张已批准的目标静帧的东西之前,先亲手把它渲染出来。
本版取代第 3 版。标着 DIRECTOR(导演)的条目是美术指导自己拍板的决定,客户一句话就能否决。
0. 故事(客户)
一只机械蝴蝶在一张蓝图上被造出来。然后它活过来,离开蓝图,世界在它周围展开。
| # | 乐章 | 媒介 | 帧数 | 拍数 | 小节数 | 状态 |
|---|---|---|---|---|---|---|
| 1 | 蓝图:图版自己画出自己,带运镜 | 蓝晒、鸭嘴笔 | 540 | 36 | 9 | 已完成、已批准、已锁定 |
| 2 | 活过来:一次连续的复苏,从微距到全景 | 铅笔 + 水彩 | 1260 | 84 | 21 | 本规格书 |
| 全片 | 1800 | 120 | 30 | 60.0 秒 |
1080x1080,30 fps,120 bpm。
从影片中砍掉(客户): 报刊插画式剖视图。砍掉(DIRECTOR,客户留给我定的那个问题,这是我的决定): 孔版印刷(riso)的苏醒段。理由:故事只有两个状态,一幅画和一个活物。在中间插进第三种媒介是绕路,而且没有任何诚实的手段能把油墨变成水彩。能把蓝晒图变成水彩的手段倒是有:水。蓝晒图是在水里显影的,打湿后蓝色会被洗淡。所以这座桥就是落在蓝图上的一滴水(第 5 节,情节拍 1)。砍掉的几幕不属于这部影片,也不随它一起交付。从它们那里保留下来的有:linkage.ts(由曲柄驱动的扇翅)、苏醒动作的词汇(齿轮咬合、触角颤动、第一次抽动)、tools/deadair.mjs、镜头 / 视角引擎、按零件缓存的绘图表面。
让它成为同一个故事的那个想法(DIRECTOR): 第一幕的蓝图,和已批准的终场静帧里躺在草丛中的那张幽灵般的蓝图,是同一张纸。第二乐章一开始就以微距贴在那张纸上,之后再也不切镜头:一次分级的拉远,把我们从一块翅膀面板带到整只生物,带到它留在身后的那张纸,带到花毛茛,带到草地,而最后一个回到画面里的东西就是那张纸,原本画着图的地方空出一个蝴蝶形状,还有一把它不再需要的钥匙。结尾的意义由第一帧铺垫好。
0.1 硬性规则
- 不许冷场。 每一秒都有看得见的东西在动。不许空白开场,不许静止定格。由
tools/deadair.mjs检查(闸门 G-AIR)。本文中的「定格」一律指镜头放慢到缓缓蠕移,而主体继续在动。 - 每个元素都有意义。 装饰就是露出机器味的破绽。
- 一镜到底。 第二乐章里没有任何剪切。每一次尺度变化都是一次运镜,而每一次大的运镜都由一次起飞触发(客户)。
1. 网格(必须遵守)
一拍 = 15 帧。一小节 = 60 帧。乐章边界落在小节线上。
- 事件(一滴水落下、一块面板被浸染、一次降落、一次起飞、一笔开始):落在 5 的倍数上。
- 降落和起飞:落在拍点上(15 的倍数)。触发镜头分级移动的起飞:凡表格里这么写的,落在小节线上。
- 一次移动内部的运动是连续的;它的起点和到达点落在网格上。
- 每个帧号都只写在
act2cues.ts里(这一乐章的新文件;孔版那张表退役到legacy/),别处一律不写。模块加载时跑gridProblems()。
2. 手艺及格线(必须遵守)
客户的检验标准:一位对作品有自尊心的人类插画师会不会把它交出去。绝不能是机械的形状拼装。
| 露馅之处(驳回) | 怎样才算过关 |
|---|---|
| 东西淡入或缩放出现 | 笔触是画出来的:水晕开,一片淡彩从笔尖落下的地方漫开,一条线被一笔画上 |
| 时间上的对称 | 一侧领先。永远不对称 |
| 活物身上用机械的缓动 | 它苏醒之后:缓入也缓出,动作重叠,跟随动作(follow-through),身体与翅膀反向起伏 |
| 用 canvas 缩放出来的零件 | 先变换控制点,再上色。永远不要放大位图 |
| 均匀撒点 | 手工摆放的成片花丛,中间留出空地 |
| 一朵花盖章盖很多次 | 每个物种 5 个手绘视角(第 6 节),花瓣带种子随机变化,一丛里任何一个视角的占比都不超过百分之二十五 |
| 用同心的扇贝边圆圈画花毛茛 | 花瓣从中心向外画,一笔笔交叠的 C 形笔触,笔触之间留出纸白(6.1) |
| 草整齐划一地摇摆 | 风是一道横扫原野的阵风锋面;草叶在风到时倾倒,再参差不齐地弹回 |
| 一种绿色平涂成带 | 按冷暖分三种绿,湿画法(wet-in-wet),上面再加干笔,画出投影和云影 |
| 渐变天空、圆盘太阳 | 有深浅过渡的颗粒沉淀淡彩;太阳就是纸面留得最亮的地方 |
| 所有东西都勾一圈轮廓 | 只在近处的平面上用时隐时现的铅笔线。远处的平面只有颜料 |
| 一张看起来像贴纸的纸 | 一个透视中的长方形,一角卷起,草叶压在它的边缘上,卷角下面有投影,周围的草被压平 |
3. 契约(不变)
renderFrame 是 (frame, env) 的纯函数。随机性只能来自 rng(seed)。核心里不许有 Math.random、Date、performance.now、ctx.filter、document、window、new OffscreenCanvas、new Image,也不许 import react、remotion 或任何宿主 / 组件模块。绘图表面来自 env.canvas()。纹理瓦片带种子。在组里直接作画用 g.touch()。缓存键写明像素所依赖的一切。给单行语句打补丁用 /* */。永远不要碰已锁定的交付物(成片,以及第一幕的源码和 MP4)。没有过你自己的安全闸门,什么都不要安装。预算:每帧绘制 150 ms,单页面,热状态。
4. 镜头模型(必须遵守)
一台在深度平面之上移动的真正的推轨车(已经为终场世界搭好):镜头距离 D,平面深度 z_i,平面缩放 s_i = 1 / (D + z_i)。主体平面是 z = 0,所以主体缩放 S = 1 / D。S 的含义是「每个图纸单位对应的屏幕像素数」:S = 1 时,生物(翼展 780 单位)宽 780 px。
S(frame)是一条穿过各个log2(S)关键帧的单调三次曲线(表 5.1)。它从不增大。第 0 帧之后,它的速度永远不为零:在两次分级移动之间,它缓缓蠕移。- 在 M 到 R 阶段,镜头中心以临界阻尼的滞后(约 25 帧)跟随生物,之后交给一条按小节设关键帧的手写路径,这条路径最终停在已批准静帧的构图上。
- 永远不要放大位图。每个平面上静态的淡彩按 sqrt 2 的 LOD 级差缓存,只缩小,最多缩小 1.41 倍。所有会动的东西都从控制点实时绘制,裁掉画框外的部分,并按屏幕尺寸降低 LOD。
- 线宽
w = w_authored * S^0.35。所有纹理都锚定在世界坐标上。S 变大时,更细一个八度的瓦片随之出现。S 最大 4.0(为了微距从 3.4 提高;水彩没有会被放粗的细线)。
5. 第二乐章,活过来(1260 帧)。客户定的六个情节拍,对齐网格。
本乐章内帧号 [start, end)。全片帧号 = 本乐章帧号 + 540。
5.1 各阶段的镜头缩放
| 阶段 | 帧 | S(主体缩放) | D | 生物在屏幕上的翼展 | 画面里有什么 |
|---|---|---|---|---|---|
| M,微距翅膀 | 0-120 | 4.0 缓缓蠕移到 3.4 | 0.25-0.29 | 3100 px,远大于画框 | 一侧前翅的翅根、面板 2、胸部窗口的边缘。极近景 |
| M2,仍是微距 | 120-240 | 3.4 到 1.6 | 0.29-0.63 | 2650 到 1250 px | 胸部和全部四个翅根;到 240 帧时是生物的大部分 |
| T1,起飞拉远 | 240-345 | 1.6 到 0.55 | 0.63-1.82 | 1250 到 430 px | 整只生物,然后是带着空白的整张图纸,然后是压在图纸边缘上的草,然后是花茎 |
| R,花毛茛近景 | 345-720 | 0.55 分级降到 0.45 | 1.82-2.22 | 430 到 350 px | 三到五朵花毛茛填满画面;每朵约 385 到 315 px。定格段:6 小节,12.5 秒 |
| F,飞行中段 | 720-870 | 0.45 到 0.18 | 2.22-5.56 | 350 到 140 px | 成片的花、草、小路,约 800 帧时画面顶部出现第一道山丘 |
| W,草地全景 | 870-1080 | 0.18 到 0.118 | 5.56-8.47 | 见 5.7(它朝我们飞来) | 原野、山丘、天空、太阳、云。图纸从左下方回到画面里 |
| 落定 + 签名 | 1080-1260 | 0.118 到 0.115 | 8.47-8.70 | 290 px(与已批准的静帧一致) | 已批准静帧的构图,活着,签了名 |
三次曲线的 S 关键帧:f0 4.0 · f120 3.4 · f240 1.6 · f345 0.55 · f420 0.545 · f450 0.52 · f525 0.515 · f555 0.49 · f630 0.485 · f660 0.47 · f720 0.45 · f810 0.24 · f870 0.18 · f1080 0.118 · f1260 0.115。两次分级之间镜头缓缓蠕移(每小节约百分之一);从 420、525 和 630 开始的那几次下降就是「分级」:每一次都由一次起飞释放,历时 30 帧。大的运镜从 240、720 和 855 的起飞开始。
5.2 情节拍 1:它变成一只真正的蝴蝶(0-240,第 1-4 小节)。阶段 M。
与第一幕的衔接是落在小节线上的一次硬切(在第一幕自己的匹配剪辑之后,这是全片唯一的一次剪切):从第一幕定住的全景图版,切到同一张图版的微距,状态相同,滴答走动的轮系也相同。视角 M0:以右侧(starboard)前翅的翅根为中心,让挂在投影线上、被抬起的面板 2 位于中心偏右,胸部窗口的边缘连同一格格走动的齿轮位于左三分之一。闸门:第 0 帧必须等于在视角 M0 下画出的第一幕最终状态(哈希一致,或高于 45 dB)。
| 帧 | 镜头 | 发生了什么 |
|---|---|---|
| 0-5 | M0,S 4.0,缓缓蠕移 | 蓝图微距。普鲁士蓝底子上的白线。轮系在第 0 帧走一格。滴答声从第一幕延续下来 |
| 5 | 一滴水落在面板 2 上。一颗透明的水珠:底下的蓝色更深,一个纸白的高光,一小圈由 4 颗小水滴组成的皇冠状飞溅 | |
| 5-60 | 蠕移 | 水流开来,一只真正的翅膀在它身后显现。 它不是呈圆形扩散:它借毛细作用顺着图线走,沿着翼梁流向铰链,每 5 帧一根翼梁(水才不管制图员的顺序)。在湿润的前锋后面,只在生物身上,每个机械零件都变成它一直代表的那块解剖结构(对应关系见 5.7):直尺画出的翼梁变软、变细、分叉,成为翅脉;膜状的面板变成翅膀上的翅室,先是一层淡淡的暖色淡彩,再趁半干点入鳞片的颜色和斑纹(翅基的鳞粉、带浅色斑点的深色顶角斑、外缘带);每颗铆钉变成一个亚外缘斑点;直尺画出的翅缘变成带细缘毛的扇贝形边。普鲁士蓝底子只在翅膀下面被洗淡,露出冷压纸的本色。前锋本身是一圈被推开的颜料形成的深蓝色边。到第 60 帧,画面中的右侧前翅毫无疑问是一只蝴蝶的翅膀,达到博物学图版的水准,而生物周围的图纸仍然是蓝图,永远都是。驳回:任何一帧看起来一边是齿轮、一边是颜色。每一帧里,上了色的部分都必须已经是解剖结构,绝不能是抽象的色块 |
| 45-60 | 蠕移 | 面板 2 归位。 它被浸染成矢车菊蓝(保留蓝图的颜色,里面还隐约透着被洗淡的直尺网格的影子),顺着投影线滑下来,虚线越缩越短,在第 60 帧就位,带着全片最后一次机械式的越冲。缺陷愈合了,并成为这个个体的标记:那块蓝色面板就在已批准的静帧上 |
| 60-120 | 缓缓向左漂过胸部,移到左侧翅根,S 到 3.4 | 水漫过身体,身体变成一只昆虫。 外壳染上一层暖色的棕灰淡彩,按体积来塑造(右上受光、核心阴影、下方的反光)。窗口里的齿轮仍随着滴答一格格地走,与此同时,胸部的绒毛从窗口边缘开始用干笔一笔笔扫进来,75-120 帧,把齿轮盖住:机械结构不是被移除,而是被长出来的东西覆盖了。腹部的环变成真正的体节,带着更浅的环带和细毛。点刻画出的眼睛变成复眼,各有一个提亮的高光。左侧翅膀在 75-120 帧显现,一条翅脉接一条翅脉,和右侧一样。横穿画面的尺寸线、引线和零件编号圈保持蓝底上的硬朗白线:图纸上的标注附件不变 |
| 120-180 | 缓缓后退,S 3.4 到 2.4 | 第一次动作,而且是一只刚羽化的蝴蝶的动作。 120:机械结构最后的痕迹,能感觉到却看不见:一次卡顿,一次回弹并保持 2 个滴答,130 帧时连走两格,像一阵贯穿胸部的颤抖。125:左侧触角(现在是一根带细环纹、末端有真正棒状膨大的触角杆)颤动,右侧在 130 帧回应。135-150:六条腿从胸部下方展开,每 5 帧一对,细而分节,撑起身体的重量;身体离开纸面一丝。150-180:一次呼吸,flap 从 1 到 0.86 再回来,左侧先动,右侧晚一个三连音。动作仍然随着滴答一格一格地走:它动起来像一台披着蝴蝶外衣的机械 |
| 180-240 | S 2.4 到 1.6 | 它柔化成一个活物:湿翅膀缓慢地扇动。 真实的蝴蝶羽化后正是这样做的,一边往翅里泵送体液一边扇动,直到翅膀干到能飞,所以湿的颜料就是湿的翅膀。扇三次,一次比一次宽:下扇分别在 180(30 帧,扇到 flap 0.6)、210(20 帧,到 0.5)、230(10 帧)。翅膀抬起时,我们第一次看到颜色更浅的反面花纹(5.7)。在这一小节里,动作从随滴答一格格走渐变为连续(motion = lerp(stepped, smooth, u),u 在 180-240 内从 0 到 1),缓动从硬性缓出变为缓入缓出,身体与翅膀反向起伏,腹部蜷曲,触角拖在后面,喙展开一次又卷回(200-220)。一块柔和的、画出来的影子在它下方的蓝色图纸上分离出来,偏移从 0 到 (14, 20)。从 180 帧起,在快速笔画上颜料比铅笔线最多滞后 9 px。到第 240 帧,任何机械的东西都看不见了。起飞的是一只真正的蝴蝶。 声音:在这一小节里滴答声逐渐变稀,每次下扇换成一声毛毡般柔软的振翅声(第 8 节) |
5.3 情节拍 2:它起飞;镜头开始拉远(240-345,第 5-6 小节)。阶段 T1。
| 帧 | 镜头 | 发生了什么 |
|---|---|---|
| 240 | 拉远从这里开始,由起飞触发 | 在小节线上起飞。 扇翅周期降到 10 帧。它离开图纸升起;它的影子向左下滑开、缩小 |
| 240-285 | S 1.6 到 0.95 | 它留下了什么: 蓝图上一个蝴蝶形状的空白,原来画着图的地方露出未曝光的白纸,因为那幅画跟着它走了。标注附件全都还在,如今什么也没标:WINGSPAN 184 横跨一个空的形状,引线指着白纸。钥匙留在图纸上。约 270 帧时整张图纸都在画面里:边框、图签框、MECHANICAL LEPIDOPTERA,还有那个洞 |
| 285-345 | S 0.95 到 0.55,中心跟着生物向右上移 | 景物出现。 草叶压在图纸边缘上;一个角卷起来,下面有影子。镜头随生物升起并倾斜:图纸产生透视缩短(作用于控制点,绕其中心在 y 方向从 1 缩到 0.45,带轻微的梯形变形),同时从左下方滑出画面,到 335 帧完全消失。花茎穿过画面升起:高、细、弯。它们后面失焦的色块逐渐清晰,原来是花瓣。前景里大片柔和的草叶(平面 z -0.2)一闪而出画面 |
| 345 | 到达 S 0.55 | 它悬停在一丛花毛茛上方 |
5.4 情节拍 3 和 4:花毛茛近景;从一朵花到另一朵,吸食花蜜(345-720,第 6-12 小节)。阶段 R。
这是全片的核心,停留的时间长到足以让人看清:六个小节。镜头只是缓缓蠕移,并随生物横向漂移,每次起飞时稍稍后退一级。
| 帧 | 拍 | 动作 |
|---|---|---|
| 360 | 24 | 降落在 R1 上(珊瑚色,正面朝向我们)。花头一沉(花茎弯 6 度,回弹一次后稳住)。翅膀平展开,然后缓慢扇动(周期 30 帧,幅度 0.35):它从不静止 |
| 375-410 | 吸食。 喙,也就是蓝图上的那根游丝,展开伸进紧实的花心(375-385)。腹部每拍搏动一次:滴答声变成了心跳。405-410 卷回 | |
| 420 | 28 | 起飞。R1 回弹。镜头在 420-450 内从 0.55 分级到 0.52 |
| 420-450 | 向右短跳一下,每次下扇都上下一颠(6 到 10 单位),俏皮地越过 R2 一点再折回来 | |
| 450 | 30 | 降落在 R2 上(泛红晕的白色,带粉色的镶边(picotee),四分之三侧面视角)。465-510 吸食 |
| 525 | 35 | 起飞。在 525-555 内分级到 0.49 |
| 525-555 | 从一根花茎后面向左穿过(它从后面经过:遮挡关系让纵深令人信服),第一阵风在 540 到来,把它往旁边推;它稳住了 | |
| 555 | 37 | 降落在 R3 上(奶油黄,侧面看是一只杯形,在画面里位置更低,同一根茎上还有一个低垂的花苞)。570-615 吸食。被它碰落的一片花瓣翻滚着落下(585-630) |
| 630 | 42 | 起飞。在 630-660 内分级到 0.47 |
| 660 | 44 | 降落在 R4 上(深洋红色,半开,画面里位置最高)。675-705 吸食 |
| 720 | 48 | 在小节线上起飞。 这一次不是小跳:它往上爬升。它释放出情节拍 5 |
整个阶段里:每朵花都按自己的周期点头(50 到 80 帧,从不共用同一个周期),叶子翻动,540 的阵风锋面在 60 帧内横扫而过,一片云影滑过花丛时阳光随之闪烁(600-690),两团种子绒毛从前景飘过。
5.5 情节拍 5:镜头继续拉远;它再次起飞(720-870,第 13-15 小节)。阶段 F。
| 帧 | 镜头 | 动作 |
|---|---|---|
| 720-810 | S 0.45 到 0.24 | 飞行中段:飞起、越过花毛茛远去,750 时兜一个圈,低低掠过一片雏菊,然后沿着小路向右。那丛花毛茛缩小成众多花丛中的一片。约 800 时山丘从画面顶部进入 |
| 810 | S 0.24,缓缓蠕移 | 落在一朵虞美人上,在最右边,原野更深处(平面 z 2.2)。短暂吸食,820-845。825 时附近草丛里飞起两只小小的白色蝴蝶(DIRECTOR):真正的蝴蝶 |
| 855 | 第 57 拍 | 再次起飞。 第二阵风在 855 到来。这次起飞释放出最后一次拉远 |
| 855-870 | S 到 0.18 | 它往上爬升,两只白蝶绕着它盘旋 |
5.6 情节拍 6:最后的全景:草地(870-1260,第 15-21 小节)。阶段 W、落定、签名。
| 帧 | 镜头 | 动作 |
|---|---|---|
| 870-1080 | S 0.18 到 0.118,手写路径,地平线最终落在 y 410 | 草地展开:远处的原野一条条成带,两道山脊,带一排树篱和一棵孤树,宽阔温暖的天空,右上方的太阳,三朵用洗淡法提出来的云向左飘,从 900 起云影滑过远处的原野。约 930 时蓝图纸从左下方重新进入画面:小小的,带着透视,一角在阵风中掀起(在 945 和 1005),上面是蝴蝶形状的空白和那把钥匙。从不刻意指给人看 |
| 900-1080 | 它朝我们飞来。 它从虞美人那里转身,穿过原野来到前景,世界在缩小,它却在变大(它的深度从 z 2.2 变到 z -5.8,所以它的缩放从 0.13 变到 0.37)。两只白蝶在 990 时分开飞走。它在 1080 到达已批准静帧中的位置 (440, 590),翼展约 290 px,然后悬停:缓慢地飞 8 字,周期 60 帧,翅膀按 10 帧一拍扇动 | |
| 1080-1140 | S 从 0.118 缓缓蠕移到 0.116 | 画面就是那张已批准的静帧,只是活着:草在闲闲地晃,花头在点,云在走,生物在悬停 |
| 1140-1155 | 一支干净的湿笔把右下角洗淡:柔和的一抹,约 250 x 60 px(见第 7 节) | |
| 1155-1185 | 写下签名,最后一笔在 1185 随着「叮」的一声结束(全片第 1725 帧) | |
| 1185-1260 | 蠕移到 0.115 | 留五拍让人读它。墨迹变干,0.75 到 0.60。生物向上飘高一点。最后一帧:已批准静帧的构图。剧终 |
5.7 画出来的生物
客户的意见:要更写实,少一些抽象。要一幅博物学水彩图版,不是色块。 媒介、暖调和花毛茛都保留。我之前提出的「翅膀像彩色玻璃」的方向撤回:它画出来的是一块块平板的面板,是错的。
及格线: 一张出自博物学对开图谱的图版(Merian,19 世纪的鳞翅目图谱),由一个把标本放在放大镜下看过的人画成。鳞翅目学者应该能叫出每个部位的名字。它仍然是一个原创物种(借用媒介,绝不借用内容):不照抄任何真实蝴蝶的花纹,但每个结构都是真实的。动任何一个点之前,先看真实的解剖和翅脉参考资料,并说明你用了哪些。
每个机械零件变成什么(这张对应关系本身就是变身情节拍,5.2):
| 蓝图 | 活的蝴蝶 |
|---|---|
| 从铰链放射出去的翼梁 | 翅脉。它们保持原来的位置,所以轮廓和节奏得以延续,但它们变成真正的脉序:一个闭合的中室,从翅基延伸到约半个翅长,翅脉从中室出发通向翅缘,会分叉,从不交叉,越靠近边缘越细 |
| 膜状面板 | 翅脉之间的翅室,覆满鳞片 |
| 沿着翼梁的铆钉 | 那一排亚外缘斑 |
| 直尺画出的翅缘 | 在各翅脉末端之间呈和缓扇贝形的翅缘,带一圈浅色 / 深色相间的细缘毛 |
| 胸部外壳和它的窗口 | 长满绒毛的胸部(绒毛长过来把窗口盖住) |
| 腹部的环 | 7 到 8 个可见的腹部体节,逐渐收细,节间有较浅的环带,带细毛 |
| 点刻画出的眼睛 | 两只大大的复眼,各有一个提亮的高光,两眼之间有一对毛茸茸的小下唇须 |
| 盘绕的金属丝触角 | 细长、带细环纹的触角,末端是真正的棒状膨大 |
| 当作喙的游丝 | 喙,静止时盘卷在两根下唇须之间,伸展开是一根细细的双管 |
| (蓝图上没有) | 六条腿,细而分节:腿节、胫节、末端带小爪的跗节。它们在 135-150 展开,停栖时抓住花瓣,飞行时收起 |
| 被抬起的面板 2 | 真实蝴蝶没有的唯一标记:右侧前翅上一个矢车菊蓝的翅室,画成一块带虹彩的鳞片斑。它随身带着的蓝图 |
翅膀,真正的两对。 前翅大致呈三角形(前缘、翅顶、外缘、内缘),后翅更圆,带着几何结构里本来就有的那条短短的尾突。前翅压住后翅的前三分之一,那片双层区域颜色更深。左右永远不是镜像(保留带种子的不对称)。
- 花纹(原创、合理、暖调): 底色是玫瑰色,越靠翅缘越过渡成桃色。翅基有暖灰棕色的鳞粉,靠近身体处毛茸茸的。前翅上有一块深棕色的顶角斑,里面有三个浅色斑点。一条深色的外缘带,朝后角方向逐渐变窄,上面排着那一排浅色的亚外缘斑。中室末端有一个深色的小中室斑。后翅上再次出现那排外缘斑点,尾突基部有一个蓝橙两色的小眼斑。
- 反面(翅膀抬起或合拢时都会看到): 和真实蝴蝶一样,与正面不同,也更素净:浅奶油桃色,带柔和的灰橄榄色大理石纹,那排斑点以较小的尺寸重复一遍,翅脉稍深一点。正反面花纹一样的蝴蝶,看起来像一张剪纸。
- 怎么画: 先在整只翅膀上铺一层浅淡的底色;花纹趁半干点进去,让它的边缘像鳞片那样柔化(除了眼斑的瞳点,不要任何硬边形状);翅脉最后画,用一支细长的勾线笔(rigger)蘸棕色,断断续续,逐渐收细,靠近翅基处更粗,绝不能是粗细均匀的线;缘毛画成一个个交替的小短笔;朝向太阳的翅缘提亮出一圈纸白的边。
- 体积与透光: 翅膀不是平的:有轻微的弧度,所以每条主脉后面都有一道柔和的阴影,中间的翅室则受光。身体在翅基上投下影子;翅膀在花上投下影子。翅膀是半透明的:翅膀叠在花瓣或天空上的地方,那种颜色有百分之十五到二十透过来,让翅膀变暖;逆光时(翅膀朝右上方的太阳抬起)底色发亮,翅脉显得更深。
- 身体: 按体积来画,而不是一个胶囊:右上受光,核心阴影,来自下方的反光,胸部的绒毛顺着生长方向用干笔扫出,体节的环带绕着圆柱体包过去。
两个手绘视角(DIRECTOR,为了花毛茛段的写实需要):
- 背面视角(现有的控制点):用于变身情节拍、翅膀平展晒太阳,以及所有飞行。
- 侧面视角,翅膀在背上合拢或半开(新的手绘控制点:身体呈侧面,六条腿抓握,前翅和后翅的反面相互叠压)。大多数蝴蝶吸食时实际上就是这个样子,图版上与背面图并排画的也是它。用在阶段 R,那时生物有 350 到 430 px,最需要写实:四次造访花毛茛中至少两次用侧面视角。两个视角之间的切换发生在降落时的振翅之中,就在翅膀经过合拢位置的那一瞬间。屏幕上小于约 150 px 时,用背面视角加姿势变换就够了。
姿势与飞行。 Pose = { flap, sweep, heading, pitch, bank },全部作用于控制点:heading 绕胸部旋转,pitch 沿身体轴线做透视缩短(1 到 0.55),bank 让左右两侧的扇翅值错开,最多 0.2。flap 来自 linkage.ts;第 240 帧之后曲柄自由、平滑地转动。飞行要像蝴蝶:手写路径,带绕行,每次下扇都上下一颠,绝不走直线,也绝不是干净的正弦曲线。它是每一帧里饱和度最高的东西,它飞行路径后面的淡彩要保持浅一个明度。翼展绝不小于 46 px。LOD:300 px 以上,上述一切都画;120 到 300 px,画翅脉、主要斑纹、停栖时的腿;46 到 120 px,画剪影、双色翅膀、深色翅缘、那个蓝色翅室。
一眼就驳回: 翅膀画成平涂色块或彩色玻璃面板;翼梁保留为直尺画的直线;左右镜像的翅膀;正反面一种花纹;胶囊形的身体;触角画成一条线加一个点;没有腿;粗细均匀的翅脉;变身过程中任何一帧看起来是「这边齿轮,那边颜色」。
6. 世界
光永远来自右上方:有受光面、背光面,每株植物的左下方都有一笔投影,生物飞得低时它也有。纸白是最亮的明度,而且是留出来的:高光、云顶、花瓣的边缘。按冷暖分三种绿。空气透视:越远越浅、越蓝、越柔和,不用铅笔线。
6.1 花毛茛,画得真实(客户)
花毛茛(Persian buttercup),Ranunculus asiaticus。动任何一个点之前,先研究真实的照片,并说明你用了哪些。
- 花头: 几十片薄如棉纸的花瓣,一层层紧密交叠、同心排列:一个杯状的莲座,像玫瑰,但比玫瑰更扁平、更规整,绝不是一个绒球。中心的花瓣最小、最直立,外缘的最大、最浅,边缘略带褶皱。各层之间是错开的,所以没有哪片花瓣正好挡在另一片后面。
- 花心: 一个紧实的黄绿色纽扣。半开的花里它是绿色的,被包裹着;完全开放时露出一个小小的深色花眼,外面围一圈黄色。
- 怎么画(这就是手艺): 从中心向外画,用一笔笔短而交叠的 C 形笔触绕着纽扣转圈,每一圈都比上一圈更大、更松。笔触之间留出细细的白纸:这些细缝就是花瓣的边缘,正是它们让花看起来是层层叠叠的薄纸,而不是一个圆盘。趁湿在靠近中心的缝隙里点进更深的颜料(纵深),让外圈花瓣保持浅淡,带一道干后形成的硬边,在背光的一侧罩一层冷色的阴影淡彩。花头不勾轮廓。
- 一眼就驳回: 带规则扇贝边的同心圆;数学螺线;一模一样的花头;花瓣画成一个个分开的椭圆排在一个圆环上;笔直的花茎。
- 五个视角,手绘: 正面;四分之三侧面(一只椭圆形的杯,内层看起来是层层堆叠的新月形);侧面(茎上的一只杯,下面绿色的萼片向后反折);半开;紧实圆润的花苞,低垂着,被萼片包住。
- 花茎: 高、细,带一点细毛,每根都有自己的 S 形曲线和粗细,常常是一朵主花加一个侧生花苞。叶子: 低矮、基生,深裂,像欧芹,画成花丛脚下一团深色的、蕨叶般的块面。
- 颜色: 珊瑚色、带粉色镶边的泛红晕白色、奶油黄、深洋红、桃色。它们就是这只生物自己翅膀的颜色,这正是它会飞向它们的原因(DIRECTOR)。
- 花丛: 9 朵花和 5 个花苞,手工摆在三种高度、三种深度上,R1 到 R4 的选取让飞行路线呈之字形:向右、向左从一根茎后面穿过、向下、向上。尺寸:一朵完整的花直径 700 单位,比生物略小。
- LOD: 120 px 以上,上述一切都画;40 到 120 px,画三圈笔触和纽扣;14 到 40 px,两种色调加花心一点;14 px 以下,只有一点。
6.2 其他一切(与已批准的静帧一致,加上它尚未完成的手艺修正)
平面:P0 前景边缘 z -0.2 · P1 主体 z 0(图纸、花毛茛花丛) · P2 z 1.0(一片雏菊) · P3 z 2.2(虞美人、秋英、它落脚的那朵虞美人) · P4 z 3.5(小路两旁的毛茛) · P5 远处原野 z 8 · P6 山丘 z 20 · P7 天空。
配角花卉,每种 4 个视角,LOD 同上:滨菊(纸白)、虞美人、秋英、毛茛(花毛茛的野生表亲)。约 14 个手工摆放的花丛中心,每个花丛内部带种子随机散布并向外衰减,另有三处只有草的空地。
对已批准静帧的改动,提请客户留意: 约在 (540, 700)、(440, 790)、(815, 680)、(920, 750) 处的近景花卉改成花毛茛,这样我们花了六个小节的那丛花,在最后一帧里也能被认出来。静帧构图里其他一切照旧:生物 (440, 590),图纸在左下,太阳在右上,签名在右下,地平线约在 y 410。
已经针对静帧列出的手艺修正,在做动画之前全都还欠着: (1) 明度范围:各种绿挤在一条窄带里,把凹处压暗、受光的坡顶提亮;(2) 花丛看起来像一团团点云,给近处的花丛画出真正的花形;(3) 图纸看起来像一张贴纸或一片睡莲叶:把它画成一个透视中的长方形,带一个卷角,草压在它的边缘上,卷角下有影子;(4) 前景是空荡荡的平涂色:P0/P1 要有带厚度和投影的草丛;(5) 签名的字形(第 7 节)。
始终在动的东西: 阵风锋面在 540 和 855 从左边进入,用 60 到 90 帧横扫过去;两阵风之间是闲散的摇摆,每丛的周期 50 到 80 帧;云向左飘;云影在 600-690 掠过花丛,从 900 起掠过远处的原野;从 345 起有种子绒毛;两只白蝶在 825-990;每朵被造访的花都一沉再回弹;5-120 湿颜料在晕开。
7. 签名(客户)
alexgreenshpun.com,像水彩画家在画角签名那样签上。是签名,绝不是字幕。
- 手写笔画放在
butterfly/finale/signature.ts里(控制点,约 8 笔),小写,连笔,略微前倾,基线上扬 2 度,字母宽窄不一,g 和 p 的下伸部分写得松一些。首先要能认出来:它是一个网址,那个点必须看得出是点。静帧现在的字形过不了这一关。 - 用勾线笔,稀释过的暖灰棕色,大约
#5b5148,随压力宽 1.3 到 2.2 px,笔画末端颜料积聚,不透明度湿时 0.75,干后变为 0.60。 - 用屏幕坐标。最后一个字母的右边缘 x = 1036,基线左端 y = 1034,宽 190 px,x 字高 12 px,上伸部分 19 px。
- 1140-1155 用湿笔洗淡腾出位置(约 250 x 60 px,把淡彩提亮约百分之四十五,末端带一点淡淡的水渍回流)。一笔笔写上去,绝不淡入:
alex1155-1160,green1160-1170,shpun1170-1175,那个点在 1175,com1175-1185。最后一笔在 1185 随着「叮」的一声结束。之后留 75 帧让人读。 - 检查:在百分之百尺寸下读得出来,缩成缩略图时融进画里看不见。不加下划线,不加花饰,不加发光。
8. 配乐(纯 JS,结构与 score.ts 相同)
12/8 拍。第一幕:八音盒,提出问题,停在五度音上,不解决。第二乐章:本乐章第 5 帧那滴水是一个单独的水滴音;动机在 5-240 底下放慢、变暖地回来;从 240(起飞)起加入弓弦感的铺底音色(pad)和第二声部;草地在 870 展开时,回答解决到主音;本乐章第 1185 帧「叮」。滴答变成脉搏: 0-180 每 5 帧一声滴答,180-240 逐渐变稀,每次下扇换成一声毛毡般柔软的振翅声;到 240 完全消失。它吸食时,每拍一声轻柔的低音脉动(心跳)。每次降落都在它所在的拍上配一声拨弦。每个起音都是一个 cue;断言采样索引 = round(frame / 30 * 48000)。
9. 引擎工作
- 为这一乐章写
act2cues.ts;孔版 / 报刊插画的表退役到legacy/,没有任何东西 import 它们。 - 水的前锋: 沿翼梁推进(按弧长,复用
nib()),到达后逐块面板浸染,底色洗淡的范围裁剪到生物剪影再外扩 6 px 出血,前锋处有一圈蓝色颜料边。水滴和皇冠状飞溅。 - 把图纸当作世界里的物体: 通过现有的视角引擎把第一幕的图版画进平面 P1,按 LOD 级差缓存,只缩小;一个
blank状态,把生物的剪影挖空成白纸;透视缩短作用于控制点。 - 曲柄上的逐格到平滑的运动混合(5.2,180-240)。
- 花毛茛:5 个视角 × 各种颜色变体,LOD,花茎,叶子,下沉与回弹。
- 姿势扩展,飞行路径,降落 / 吸食 / 起飞状态,喙。
- 按现有实现复用:推轨平面、植物 LOD、阵风、云、生物上色、签名、
deadair.mjs。如果微距段(大面积的湿淡彩)或最后几个小节超过 150 ms,先削减草叶数和笔画数,再考虑动外观,并且告诉我。
10. 闸门(先出静帧,我逐一审阅;按照无碰撞协议,我审阅的是副本,并通过客户返回编号的修改清单)
| 闸门 | 交付物 | 通过标准 |
|---|---|---|
| G-R 花毛茛(第一个) | 一张图:5 个视角 × 3 种颜色,全 LOD,再加上按阶段 R 构图的花丛,生物停在 R1 上 | 对照 6.1 做手艺审阅。这一关没过之前不做任何动画 |
| G-M 变身(metamorphosis) | 6 张静帧:本乐章第 0、5、30、60、120、210 帧 | 第 0 帧等于第一幕在视角 M0 下的最终状态。水看起来像水。面板 2 归位并且是蓝色。按 5.7 的写实要求:每个采样帧里,每个上了色的部分都是叫得出名字的解剖结构,绝不是「这边齿轮,那边颜色」;到 210 帧时,它是一只完整、认得出来的真蝴蝶,有腿、棒状触角、脉序、斑纹和反面。另加一张图版静帧:完成后的生物,背面和侧面并排,做成一幅博物学图版 |
| G-S 图纸 | 3 张静帧:本乐章第 270 帧(带空白的整张图纸)、320(草压在边缘上,透视缩短)、1080(在全景里) | 它是一张纸,不是一张贴纸。那块空白看得出是这只蝴蝶的缺席 |
| G-W 全景 | 用五项修正和花毛茛替换重新渲染的已批准静帧 | 客户重新批准这个终点画面 |
| G-MOTION | 每拍一格的印样表(84 格)+ MP4 | 表 5.1 到 5.6 逐帧对得上;降落和起飞都在各自的拍上;镜头关键帧误差在百分之二以内 |
| G-AIR | 对本乐章和全片跑 tools/deadair.mjs | 没有完全相同的连续帧;没有哪个 15 帧窗口的变化面积低于百分之零点五 |
| G-FILM | out/butterfly.mp4、dist/butterfly.html | h264 + aac,1800 帧,解码干净,单页面上绘制耗时中位数低于 150 ms、p95 低于 200,探针帧上满足确定性(哈希一致,否则高于 45 dB) |
11. 留给客户决定的事(都不阻塞制作)
- O1. 不做孔版苏醒段(第 0 节)。如果你想把它加回来,就需要第二个过渡手段,而我会反对。
- O2. 从第一幕过来的衔接是在小节线上硬切到微距。另一种做法是在完成的图版上做一次 30 帧的推进,代价是每帧都要把整张图版重画一遍。
- O3. 已批准静帧上的四朵近景花改成花毛茛(6.2)。
- O4. 那两只白蝶,以及结尾时生物朝我们飞来、好让它最终停在静帧里的尺寸。
- 第一幕已锁定、已批准,而它在开头没通过冷场检查(据闸门报告,前几秒里有 43 帧完全相同)。改两个 cue 就能修好。要不要为此解锁它,由客户决定。
- O6. 时长:复苏部分 42 秒,全片 60 秒。如果必须更短,就修剪阶段 F 和一次花毛茛降落,绝不动微距段或结尾。