# 从这里开始：先和对方商定作品，再动手做

anidoodle 能用许多种手笔做许多种东西。一件作品没有哪一点是事先定死的：长度、形状、画风、声音都不是。所以第一件事是弄清这个人想要什么，要快，一次问一个问题，并且每一处空缺都用一个明说出来的默认值去填，而不是靠猜。

## 需求问询（只问请求里没定下来的）

每轮只问一个问题，给出简短的选项，把你的推荐放在最前面。如果对方说「你来挑」，那就挑，用一句话说明挑了什么、为什么，然后接着往下做。

1. **你要做什么？** 一张静帧、一段循环动画、一幅自己把自己画出来的画、一部故事影片、一部讲解片、一张信息图、一部发布片或产品视频、一件交互式网页作品、一堂绘画课、一个角色，或者照着对方的图匹配出来的画风。[入口页](../../index.md)里的表格把每一种分派到它的工作流文件。
2. **用哪种画风？** 给对方看图库（[风格总览图](../../assets/styles.jpg)，一种手笔一格；列出每种手笔所用媒介的清单是 [references/styles/index.md](../styles/index.md)）。推荐两三种适合题材和受众的手笔，每种给一个理由。另外提供两条路：
    - **「照我的图来」**：对方带来一张图，你改编出它的手笔（[adapt-a-style.md](adapt-a-style.md)）。
    - **「自家画风」**：对方以前已经选定过一种；从 `styles/house/` 载入。
3. **什么形状、放在哪里？** 方形 `1x1`、竖版 `9x16`、宽屏 `16x9`、竖幅 `4x5`，或者对方说出的任意宽 × 高。一份源可以出好几种形状（[references/formats.md](../formats.md)）。
4. **多长？** 任意长度。三秒的贴纸、九十秒的故事、五分钟的讲解片、二十分钟的课。永远不要给长度设上限，也永远不要替对方假定长度。长作品分章节（[long-film.md](long-film.md)）。
5. **要声音吗？** 无声，或者配乐：说出一种音乐风格，以及每一段的情绪（[references/music/](../music/index.md)）。对方自己的旁白或音轨由对方自带；其余一切由 anidoodle 作曲并演奏。
6. **要角色吗？** 一个新角色（只建一次，[character-consistency.md](character-consistency.md)）、对方已经写在某个模块里的角色，或者来自对方图片的角色（作为参考，只有对方要求时才嵌入）。

一旦能动手做了，就停止提问。两个问题答得好，胜过问六个。

## 对方没说时的默认值

| 未定的问题 | 默认值 | 为什么 |
|---|---|---|
| 画风 | 配方最契合题材的那种手笔，点出名字并给出理由 | 画风是一个决定，不是掷硬币 |
| 形状 | 社交平台用 `1x1`，网页头图和 YouTube 用 `16x9`，Reels/Shorts/TikTok 用 `9x16` | 放在哪里决定了形状 |
| 长度 | 静帧：一帧；循环动画：4-8 秒；故事影片：长到足够走完它的故事弧线；讲解片：每章一个概念 | 长度由内容决定，不由模板决定 |
| 声音 | 影片配上风格契合其情绪的配乐；循环动画或静帧无声 | 无声也是一种选择 |
| fps | 30（要手绘卡通感用 24，纸艺和定格动画用 12，一拍二） | 媒介自身的节奏 |

## 动笔之前先写下来

在项目里放一份简短的 brief 文件：类型、画风（以及理由）、形状、长度、声音（风格 + 各段情绪）、角色、一句话的构想。对方说过的每一句话都用对方的原话写进去。你自己决定的每一项都标明是你定的，好让对方一句话就能否决。

## 第一次完整渲染之前

- **有选项没定时，把选项做成一张静帧对照表**（一个转场、一种手写字的媒介、一套配色）：三到六个变体并排摆出来，对方一条消息就能选定。然后再渲染。
- **审静帧要审设计**，而不只是审有没有东西重叠（[references/craft-bar.md](../craft-bar.md)）。
- **自己把自己画出来的画要声明这一点**：在影片的 `meta` 里写 `kind: "drawing"`。一个点描的点或一道排线改动的面积远不到画面的 0.5 %，所以不声明的话，闸门会把一段绘制判为冷场；声明之后，冷场按 1 秒的窗口、0.02 % 的下限来判，而且手在两遍之间可以停半秒。`meta: { title, W, H, fps, bpm, durationFrames, kind: "drawing" }`。

## 「活的」意味着真正的运动 { #alive-means-real-motion }

当有人要求一个主体「活起来」「游起来」或「动起来」时，原地循环看起来就像一张 GIF。主体要穿行于一个随它移动而变化的世界，镜头跟着它走。现成的示例是锦鲤：`koi.ts` 接受一个可选的 `KoiLive`（时间、幅度、路径上的一个姿态），`koiWorld.ts` 让它游过一个比画面大得多的池塘，从摆放在世界里的睡莲叶下面滑过，尾迹从它的鼻尖向外扩散。

做法：

1. **把运动作为可选输入**加到主体的绘制函数上（`live?: KoiLive`）。不传它时，代码路径就是静帧，原封不动。
2. **守住静帧**：改动前后各用 `still.mjs` 渲染一次静帧样张，比较它打印出的 md5。静帧必须保持逐像素一致；如果它变了，说明重构把改动漏了进去。
3. **用世界单位摆放世界**，不用屏幕单位，这样场景会随着主体移动而变化；让镜头跟随（[references/camera.md](../camera.md)）。
4. **活的版本的第 0 帧等于静帧**（同样的姿态、同样的构图），这样影片可以从静帧卡片无接缝地交接到活的那一版。
