# MECHANICAL LEPIDOPTERA：影片规格书，第 4 版（先**造出来**，再**活过来**）

角色：美术指导撰写并审阅这份规格书，制作者负责实现，客户负责审批。项目：本 skill 的 [example/](index.md)（一个供研究的完整参考，不是模板）。动手之前按这个顺序读：先把本文件从头到尾读完；再读 [../references/determinism-and-contract.md](../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 硬性规则

1. **不许冷场。** 每一秒都有看得见的东西在动。不许空白开场，不许静止定格。由 `tools/deadair.mjs` 检查（闸门 G-AIR）。本文中的「定格」一律指镜头放慢到缓缓蠕移，而主体继续在动。
2. **每个元素都有意义。** 装饰就是露出机器味的破绽。
3. **一镜到底。** 第二乐章里没有任何剪切。每一次尺度变化都是一次运镜，而每一次大的运镜都**由一次起飞触发**（客户）。

---

## 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，把淡彩提亮约百分之四十五，末端带一点淡淡的水渍回流）。一笔笔写上去，绝不淡入：`alex` 1155-1160，`green` 1160-1170，`shpun` 1170-1175，那个点在 1175，`com` 1175-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. 引擎工作

1. 为这一乐章写 `act2cues.ts`；孔版 / 报刊插画的表退役到 `legacy/`，没有任何东西 import 它们。
2. **水的前锋：** 沿翼梁推进（按弧长，复用 `nib()`），到达后逐块面板浸染，底色洗淡的范围裁剪到生物剪影再外扩 6 px 出血，前锋处有一圈蓝色颜料边。水滴和皇冠状飞溅。
3. **把图纸当作世界里的物体：** 通过现有的视角引擎把第一幕的图版画进平面 P1，按 LOD 级差缓存，只缩小；一个 `blank` 状态，把生物的剪影挖空成白纸；透视缩短作用于控制点。
4. 曲柄上的**逐格到平滑的运动混合**（5.2，180-240）。
5. 花毛茛：5 个视角 × 各种颜色变体，LOD，花茎，叶子，下沉与回弹。
6. 姿势扩展，飞行路径，降落 / 吸食 / 起飞状态，喙。
7. 按现有实现复用：推轨平面、植物 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 和一次花毛茛降落，绝不动微距段或结尾。
