# 角色 / 场景「固化」设计规范 v0（结构化角色圣经 · 方案 B）

日期：2026-06-06
状态：**调研 + 设计阶段（未实现）**。按规则 8，本文是动手前的方案文档；样张评审通过、用户确认后才进实现。
覆盖代码版本：v0.8（generationCanvas）
依赖文档：
- `docs/design/nomi-cards-design-v1.md`（分类卡片设计 v1 — 4 类卡片的真实需求与 MoSCoW）
- `docs/design/nomi-design-system.md`（设计系统 v1 — token / 卡片视觉）
- `src/config/modelArchetypes/types.ts`（模型档案 = 「声明要几个什么槽」的真相源）

> **一句话（v2 修正版）**：把角色卡 / 场景卡从「一张代表图 + 名字」升级成「**一张布局好的角色身份板大图**」——
> 全身图 / 三视图 / 表情 / 动作 / 装备拆解 / 色板 / ID 块**全部排在一张大图上、模型一次生成**（成本 = 一张图）。
> 这张大图既是卡片封面，也是喂给下游的标准参考；要单独取某一面（侧面 / 愤怒脸）= **复用现有「裁剪 / 九宫格截图」工具**在大图上切片。

## §0 决策记录（用户拍板 + 评审收敛，2026-06-06）

| # | 岔路 | 定案 | 依据 |
|---|---|---|---|
| D1 | 固化产物形态 | ~~B 结构化子图集~~ → **D9 推翻** | 见 D9 |
| **D9** | **产物形态（修正）** | **一张布局大图 · 一次成图**；模型自己排版，提示词指定布局 | 用户出示真实案例（女主/柴犬、ASHRAIL 雾烬）：业界都是「一张大图布局好」，**一次生成成本极低**。我之前的「抽屉里 N 张分开生成」= 贵 + 违反规则 1 |
| **D10** | **取单件方式** | **复用现有工具栏「裁剪 / 九宫格截图 / 四视图截图」** 在大图上切片 → 子图进素材池 → 下游 @ 引用 | 切图能力已存在（`NodeImageEditToolbar`），不另造抽屉（规则 1）|
| **D11** | **入口** | 点角色卡 → 顶部图片工具栏**最前加「定妆」按钮** | 用户拍板：挂现有工具栏，不另造入口 |
| D2 | 首批覆盖对象 | **角色（Cast）+ 场景（Scene）** | 用户拍板；道具暂缓 |
| D3 | 功能命名 | **「定妆」（角色）/「定景」（场景）** | 真实用户：「固化」太工程没看懂；定妆=影视圈熟词（演员定妆照）。词汇=用户真名 |
| D4 | 入口图标 | **「转身箭头」**（各角度定下来），**弃盾形** | 真实用户：盾=加密/保护，与「定各角度」不搭 |
| D5 | 固化态载体 | ~~小卡 + 抽屉~~ → **D9 简化**：卡片直接用大图当封面；点开 = 放大看大图（无需复杂抽屉编辑器） | 大图本身就是档案，不需要逐槽抽屉 |
| D6 | 生成策略 | ~~小步试 + 单张重抽~~ → **D9 简化**：一次成图；不满意整张重生 / 或局部编辑；单件靠裁剪 | 一次成图后「8 张手抖」问题消失（成本=1 张）|
| D7 | 命名仍保留 | 「定妆 / 定景」 | 同 D3 |
| D8 | AI/user 角标 | （仅当展示切出的子图集时适用）AI 默认不标 | 设计师：满屏 accent 是噪音 |

> 获批样张：v0/v1 **形态已废**（抽屉版），按 D9 重做 v2（一张大图 + 工具栏定妆入口）。v0/v1 留档对比。
> 实现前仍需收敛 §6 开放问题。

---

## §0.5 修正后的形态（D9，权威，覆盖下文 §3/§4/§5 中「逐槽/抽屉」的旧描述）

```
点角色卡 → 顶部工具栏点「定妆」
   → 定妆面板：选基准图 + 勾「大图里要哪些区块」(英雄全身/三视图/表情/动作/轮廓/装备拆解/色板/ID块) + 选风格
   → 一次生成 → 一张「角色身份板」大图
   → 大图成为角色的定妆图（卡片封面 + 下游标准参考）
   → 想取单件(侧面/愤怒脸)：用现有工具栏「裁剪/九宫格截图」在大图上切 → 子图进素材池 → @ 引用
```

**修正后的数据模型（简化）**：
```ts
// 角色节点：定妆图 = 一张高清大图（不是 SheetImage[] 数组）
export type CharacterMeta = {
  tagline?: string; taglineSource?: FieldProvenance
  tags?: string[]
  // —— 定妆 ——
  sheetUrl?: string          // 定妆大图（高清；卡片封面 + 下游参考都用它）
  sheetProvenance?: GenerationProvenance  // 复用现有 provenance（模型/prompt/seed，可复现）
  sheetSections?: string[]   // 这张图里包含了哪些区块（仅记录，供再生时回填勾选）
  fixedAt?: number
}
// 切出的子件 = 走现有裁剪/截图 → 生成普通 asset/image 节点，自动进 useAssetPool。无需新结构。
```

> 原 §3.1 的 `SheetImage[]` 结构**降级为可选的后期增强**（若将来要「一键取侧面」而非手动框选，
> 再在大图上记录区域 bbox + 语义标签）。MVP **不需要**——靠现有切图工具足矣。

## §0.6 落地架构（用户拍板 2026-06-06）：两层 + 工具已备 + 缺口=提示词写作

**核心定位**：调工具（建节点 / 注入提示词 / 触发生成）我们**已经有了**；真正要做、有壁垒的是**「提示词的写作」**——把通用脚手架写好，并在剧本场景下填成贴合的 prompt。**通用模板没法服务所有人**，所以分两层：

| 层 | 触发点 | 工作流 | 定位 |
|---|---|---|---|
| **Tier 1 基础（通用）** | **图片节点浮条**（`NodeImageEditToolbar`，加「定妆」） | 点 → 套**最基础通用模板**（基础三视图 + 人物基本款）→ 生成（带确认） | 谁都能用的**兜底**，只到「最基础那一档」 |
| **Tier 2 剧本驱动（做到好）** | **剧本 / 创作区一个触发点** | AI 读剧本 → 在对应节点建角色卡/场景卡 → **注入按剧本写好的提示词** → AI 问「要不要生成」→ 用户定 | 贴合具体剧本，**质量来源**（对应实测 v2 ≫ v1） |

### 工具盘点（`src/workbench/generationCanvas/agent/generationCanvasTools.ts`）—— 基础设施已就绪

| Tier 2 需要 | 现有工具 | 状态 |
|---|---|---|
| 建角色/场景卡节点 | `create_nodes({kind,title,prompt,position})` | ✅ |
| 注入提示词 | `update_node_prompt(nodeId, prompt)` | ✅ |
| 挂参考图 | `set_node_references(nodeId, refs)` | ✅ |
| 连线 / 读上下文 | `connect_nodes` / `read_canvas` / `read_node_context` | ✅ |
| **AI 问"要不要生成"** | `generate_image` 不传 `confirmed:true` → 返回 `requiresConfirmation:true` + preview | ✅ **正是用户要的确认机制** |

→ **结论：Tier 2 的"调工具"不用新造。** 缺的两块：

1. **提示词写作（我们的核心活）**：
   - **Tier 1 通用脚手架**：基础三视图 + 人物基本款（含 §5.7 的 10 条规律 + §5.7.1 的逐字标注）。
   - **Tier 2 剧本驱动**：读剧本上下文（角色被引用的分镜/场景/道具/情绪）→ 填进脚手架 → 拼出贴合 prompt（§5.7.1 的剧本反推表）。
   - 两层**共用一个 prompt 模板模块**（`fixationPromptTemplates.ts`），Tier 2 只是多喂剧本上下文。
2. **GPT Image 2 mapping 修复**：否则 `generate_image` 出不了图（§5.7.1 实测确认的契约：`input_urls` + `aspect_ratio`，结果 `resultJson.resultUrls[0]`）。

### 落地顺序（依赖关系）
```
① GPT Image 2 mapping/archetype 修（基础，解耦，不修则一切生成无效）
② prompt 模板模块（我们的核心；Tier1/Tier2 共用）
③ Tier 1：浮条「定妆」按钮 → 套基础模板 → generate_image(确认)
④ Tier 2：剧本区触发 → agent 读剧本 → 写 prompt → create_nodes/update_node_prompt → 问生成
```

---

## §1 调研结论：业界「固化」= 三层叠加

| 层 | 干什么 | 关键手法 |
|---|---|---|
| ① Prompt 层 | 触发「设定集」版式 | `character sheet / turnaround / model sheet` + `multiple views of the same character` + `same outfit` + **`比例一致, 避免夸张透视`** + 白底 + 中性姿势(T/A-pose) |
| ② 控制层 | 锁脸 / 锁姿态不漂 | SD: ControlNet(OpenPose/Canny) + IP-Adapter FaceID；MJ: 固定 seed + 命名 + 垫图；新模型(Nano Banana Pro / Seedream 4.5): 直接图生图出多角度 |
| ③ 资料卡层 | 结构化成「官方设定集」 | 三视图(正/侧/背) + ≥5 表情(**配「保持同一张脸」**) + 装备分层拆解 + 色板(主/辅/点缀 + 材质) + 世界观短文 + 网格白底布局 |

**两句保命约束**（翻车根因）：
1. 只写「三视图」不写「**比例一致**」→ 三张透视各异的摆拍图。
2. 只写「多表情」不写「**保持同一张脸**」→ 模型乐意给你换脸。

来源：Scenario turnaround 指南、Apatero 2026 指南、木瓜 AI 角色资料卡模板、腾讯·MJ 角色一致性。

我们的取舍：**① + ③ 我们必须做**（Prompt 模板 + 结构化产物）；**② 控制层不自建**，按规则 1/5——
直接吃模型自己的图生图多角度能力（Seedream/Nano Banana 这类），通过档案的参考槽喂基准图。

---

## §2 现状盘点（已有 / 别造并行版）

| 已有能力 | 位置 | 说明 |
|---|---|---|
| 角色 / 场景 / 道具卡节点 | `nodes/render/CharacterCardNode.tsx` 等 | **薄**：一张图 + 名字 + 一句 tagline + 使用计数 |
| 分类骨架 | `model/generationCanvasTypes.ts` `CATEGORY_IDS` | `['shots','cast','scene','prop','audio']` |
| 卡片元数据 | `model/nodeMetaFields.ts` `CharacterMeta`/`SceneMeta` | 现仅 `tagline/tags` / `mood/tags`，带 `*Source` 用户/AI 来源标记 |
| 下游复用机制 | `registry.ts` `providesImageReference:true` + 引用 3 原语 | 角色卡可被 @ 引用 / 连线当 image reference |
| 变体链 / 用量反查 | `generationCanvasTypes.ts` `regeneratedFrom` / `derivedFrom` / `shotIndex` | 数据已存在，UI 只显示计数 |
| **★ 多角色参考槽** | `config/modelArchetypes/types.ts` `ArchetypeReferenceSlot` | `image_ref` + `characterIndexed`（按序对应 prompt 的 `character1..N`）。**「档案声明槽、通用系统填」的落地点** |

**缺的那一层 = 本设计要补的**：把角色从「一张代表图」变成「**结构化子图集**」。
现在用户只能手搓一长串 prompt 碰运气，产出的设定集**没有结构**，取不出单独的「侧面 / 愤怒脸」喂下游。

---

## §3 方案 B 数据模型（结构化固化）

**原则（规则 1/9）**：结构挂 `node.meta`，**不动顶层 schema**；子图复用 `AssetRef`（一处素材池真相源）；
能力声明走 `modelArchetypes`，不给卡片焊专用 UI。

### §3.1 角色固化子图集（扩 `CharacterMeta`）

```ts
// nodeMetaFields.ts 扩展（新增字段，沿用 *Source 用户/AI 来源标记）
export type CharacterSheetSlotKind =
  | 'front' | 'side' | 'back' | 'three_quarter'   // 角度（三视图 + 3/4）
  | 'expression'                                    // 表情（label: 平静/微笑/愤怒…）
  | 'outfit'                                        // 服装变体（label: 校服/便服/雨衣）

export type SheetImage = {
  id: string
  slotKind: CharacterSheetSlotKind
  label?: string            // '愤怒' / '校服' / '侧面'
  assetRefId: string        // 指向素材池（复用 AssetRef，不另存 url）
  source: FieldProvenance   // 'user' 上传 vs { ai: ts } 生成
}

export type CharacterMeta = {
  tagline?: string; taglineSource?: FieldProvenance
  tags?: string[]; tagsSource?: FieldProvenance
  // —— 新增：固化档案 ——
  sheet?: SheetImage[]            // 结构化子图集
  bio?: string; bioSource?: FieldProvenance        // 世界观短文（资料卡右下角）
  palette?: { hex: string; role: 'main'|'sub'|'accent'; material?: string }[]  // 色板（可后期）
  fixedAt?: number               // 最近一次固化时间戳
}
```

- `node.result.url`（主形象）**不变**，仍是卡片封面 + 默认参考。`sheet` 是它之上的「档案」。
- 子图的 `assetRefId` 指向 `useAssetPool` 里的素材 → 下游 AssetPicker/AssetMention 能直接取到「小苏-侧面」。

### §3.2 场景固化子图集（扩 `SceneMeta`，同一套结构）

```ts
export type SceneSheetSlotKind =
  | 'time'        // 时段（label: 白天/黑夜/黄昏/雨/雪）—— 卡片设计 v1 §1.4 点名痛点
  | 'angle'       // 机位（label: 广角/俯视/过肩）

export type SceneMeta = {
  mood?: string[]; moodSource?: FieldProvenance
  tags?: string[]; tagsSource?: FieldProvenance
  // —— 新增：与角色同构，slotKind 不同 ——
  sheet?: SheetImage[]   // 复用同一 SheetImage，slotKind 用 SceneSheetSlotKind
  fixedAt?: number
}
```

**关键**：角色的「多视角」与场景的「多时段」是**同一套子图集结构**，只是 `slotKind` 枚举不同。
→ 一个通用 `<FixationSheet>` 组件 + 一个通用「固化生成」流程，**两类共用**，不写两套（规则 1）。

---

## §4 设计到哪一层（模块归属）

| 关注点 | 住哪 | 为什么 |
|---|---|---|
| **固化生成能力** | `modelArchetypes` 新增一个 mode（如 `intent: 'character'` 的「设定集」模式） | 通用第一：任何模型只要声明「基准图 in → 多角度 out」槽就能跑，不给角色卡焊专用 UI |
| **固化产物结构** | `node.meta.sheet`（§3） | 不动顶层 schema；沿用 `*Source` 标记，AI 重提不覆盖用户手填 |
| **子图复用** | `useAssetPool` + AssetPicker/AssetMention | sheet 子图进素材池真相源，下游 @ 引用「角色-侧面」 |
| **Prompt 模板** | 新建 `fixationPromptTemplates.ts`（含「比例一致 / 保持同一张脸」保命句） | 不让用户手搓；按 slotKind 拼模板 |
| **卡片固化态 UI** | 新建 `<FixationSheet>`（角色/场景共用），由 CharacterCardNode/SceneCardNode 调用 | 共用组件，别写两套 |

---

## §5 生成流程（B：一次出整张 → 切片 / 或逐槽生成）

两种产出路径，**默认走 5.A**，5.B 作为高保真补充：

- **5.A 一次出整张 + 切片**：喂基准图 + 设定集模板 → 出一张多面板大图 → 用户/AI 在大图上框选切成结构化子图（写入 `sheet`）。快，符合多数模型现状。
- **5.B 逐槽生成**：以主形象为 `characterIndexed` 参考，逐个 slot（侧面/背面/愤怒…）单独图生图 → 每张直接成 `SheetImage`。一致性更可控、可单独重生，但更慢更贵。

二者产出**同一个 `sheet` 结构**，UI 不区分来源（只看 `source` 标记 user/ai）。

---

## §5.5 模型能力是固化的地基（小红书实战印证）

固化质量**不取决于我们的 UI，取决于模型支持几张参考图**。这条决定档案怎么声明槽：

| 模型 | 多图参考能力 | 对固化的意义 |
|---|---|---|
| Nano Banana Pro | **14 张**参考图（6 张高保真），「身份锁定」 | 三视图 / 多表情一致性最稳；`image_ref.max` 可给到 6~14 |
| 即梦 4.0 (Jimeng) | **不支持多图参考**；但中文排版/小红书风强 | 固化只能逐张图生图（5.B 路径），或退化成单图；适合做下游封面排版 |
| Seedream / Vidu Q1 等 | 多图（Vidu Q1 支持 7 张） | 介于两者之间 |

**落地纪律**：固化模式的 `ArchetypeReferenceSlot.max` **不是写死常量**，由该模型档案声明（认模型身份）。
认不出的模型走通用回退（按接入文档原样、单图参考）。组合工作流的边界：**我们只做「固化」这一段**
（产出结构化子图集），中文封面排版是下游应用，不并进固化流程。

来源：[人人都是产品经理·即梦 4.0 vs Nano Banana 评测](https://www.woshipm.com/ai/6268463.html)、[腾讯·即梦 4.0 进阶玩法](https://news.qq.com/rain/a/20250911A075KL00)、[量子位·Vidu Q1 7 图参考](https://www.qbitai.com/2025/09/330076.html)。

---

## §5.6 提示词模板库（从小红书实战沉淀，实现需写死）

固化生成**不让用户手搓**。**主模板**是用户出示的真实生产级「角色身份板」提示词（一次出整张大图）——
模型自己负责布局，提示词只指定「要哪些区块 + 身份锁定 + 排版风格」。

### §5.6.0 主模板：角色身份板（一张大图，来源 GPT-Image-2 角色表，用户提供）

```
创建一张艺术性的 16:9 角色身份板。
[主体]：使用参考图像 {基准图}。
纯白色 / 柔和米白色背景。无环境、无道具、无标志、无水印。

设计方向：不要创建标准的角色参考表。创建一张电影感的身份板，感觉像高端动画工作室的
角色研究与艺术书排版的结合。布局应不对称、优雅且视觉上令人难忘。使用大片留白、多样化
的图像比例和有意的不平衡。避免网格、蓝图设计、目录布局和重复的转场展示。

重要布局规则：不要重复任何角色视角。每个视角必须有清晰的分离和呼吸空间。保持所有身体、
肖像、轮廓和细节的视觉区分。无裁剪身体、无隐藏肢体、无堆叠人物、无合并姿势。

主要构图：放置一个大型英雄全身视角，略微偏离中心作为视觉锚点。围绕它，以干净的间距排列
较小的辅助研究：中性全身视角、背面视角、侧面视角、坐姿、倾斜姿势、蹲姿、俯视身体角度、
仰视身体角度、富有表现力的肖像研究。每个视角应感觉像独立的干净角色研究，而非来自一个场景的帧。

【身份锁定 ← 保命约束】在所有视角中保持严格的身份一致性：相同面部、相同面部比例、相同发型、
相同服装、相同身体比例、相同姿势语言、相同视觉个性。

有用参考细节：使角色便于未来的图像和视频生成——清晰的面部形状 / 发型轮廓 / 服装轮廓 /
身体形状 / 手部 / 姿势 / 表情范围。

艺术性部分：包含一个轮廓研究区域（2–3 个简化黑色剪影）；一个小表情研究区域（细微情感变化）；
一个细节研究区域（面部、头发、服装的关键视觉特征）。

文本设计：添加一个时尚的角色 ID 块，简约、大胆、艺术导向，仅含：名称 / 角色 / 核心情绪 /
视觉标志。仅在有帮助处用小型手写风格标签，允许细微的编辑箭头与标注，但保持简约优雅。

风格：{风格行}。简约、电影感、高端、艺术书般、干净、富有表现力，适用于制作。

最终图像应像一张艺术性角色身份板，帮助 AI 模型理解角色的面部、轮廓、服装、姿势与情感范围。
```

**勾选区块 → 注入对应句**：用户在面板勾「英雄全身 / 三视图 / 表情 / 动作姿态 / 轮廓 / 装备拆解 / 色板 / ID 块」，
按勾选拼上面对应段落（如不勾装备就删「装备拆解」句）。「身份锁定」段**始终保留**。

> 配套（同一工作流，用户提供，留档）：**故事板提示词**（12 电影分镜，用定妆角色出分镜）、
> **Seedance 2.0 视频提示词**（故事板参考 → 15s 视频）、**Midjourney 风格码**（`--ar 2:3 --exp 80 --sref … --profile … --v 7`）。
> 这三者是**下游**（分镜/视频），不属定妆本身，但说明定妆图是整条流水线的「身份锚」。

### §5.6.1 旧·逐槽模板（降级为「局部重生 / 切片后单独补」时备用）

按 `slotKind` 拼模板（`{}` 为运行时填充），均内置两句保命约束。

**角色 · 三视图槽**（front/side/back/three_quarter）：
```
角色设定三视图，正面/侧面/背面水平排列，白底，T-pose 站姿，全身入镜。
保持人物面部特征与参考图①完全相同，服装、配色、发型、配饰严格统一。
比例一致，避免夸张透视。{角色描述} {风格行}
```

**角色 · 表情槽**（expression，label=平静/微笑/愤怒/惊讶/轻蔑）：
```
同一角色的表情变化：{表情label}。保持同一张脸——五官、发型、配饰与参考图①完全一致，
仅改变表情。白底，半身。{风格行}
```

**角色 · 服装变体槽**（outfit，label=校服/便服/雨衣）：
```
同一角色换装：{服装label}。保持面部、发型、体型与参考图①完全一致，仅替换服装。
全身，白底，T-pose。{风格行}
```

**场景 · 时段槽**（time，label=白天/黑夜/黄昏/雨/雪）—— 核心句式「保持结构只改 YY」：
```
保持该场景的建筑结构、布局、机位完全相同，仅将光照/天气改为：{时段label}。
{白天→明亮自然光 / 黑夜→冷色夜景灯光 / 雨→湿润反光阴沉 / 雪→屋顶院落积雪冷光}。
```

**场景 · 机位槽**（angle，label=广角/俯视/过肩）：
```
保持该场景的所有元素、材质、配色完全相同，仅改变机位为：{机位label}。
```

**风格行**（按项目气质替换，挂在档案/项目级，不每次手填）：
- 日系：`clean anime character sheet, crisp lineart, cel shading`
- 厚涂：`semi-realistic concept art sheet, painterly rendering, material definition`
- 赛博：`techwear design sheet, UI-like layout, schematic callouts`

> 模板沉淀位置：`fixationPromptTemplates.ts`（§4）。来源：[木瓜 AI 角色资料卡](https://www.mooko.cn/article/347)、
> [GPT-Image-2 三视图实操](https://blog.csdn.net/piaoxue166/article/details/160679873)、小红书 Nano Banana/即梦 实战帖。

---

## §5.7 提示词工程手册 —— 「出图效果好」的 10 条硬规律（专项调研，2026-06-06）

> 用户点：设计没问题，但**「什么提示词出图效果好」最难**。专项调研了 Nano Banana Pro / GPT-Image-2 /
> 即梦 的真实生产做法。结论：高质量身份板 = **我们用一套调好的「质量脚手架」兜底（用户不手搓）** +
> **用户只勾区块/选风格/给基准图**。下面 10 条是脚手架里**始终注入**的内容。

| # | 规律 | 具体做法（写进模板） |
|---|---|---|
| 1 | **人设打底**（实测有效） | 开头给模型角色设定师人设：「你是顶尖游戏/动漫概念美术大师，擅长详尽角色设定图，具备**像素级拆解**能力」 |
| 2 | **中心锚点 + 不对称环绕，绝不网格** | 一个大型英雄全身立绘略偏中心作**视觉锚点**；周围**干净间距**排小研究；手绘箭头/引导线连接。明令**避免网格/蓝图/目录布局/重复转场** |
| 3 | **身份锁定 7 连**（最关键） | 「所有视角保持严格一致：**相同面部 / 相同面部比例 / 相同发型 / 相同服装 / 相同身体比例 / 相同姿势语言 / 相同视觉个性**」 |
| 4 | **身份 tag 放前 10 词** | prompt 最前先写唯一身份标签 + 核心特征，模型**早锁身份**（first-10-words 法则） |
| 5 | **词要逐字复用** | 「emerald eyes」就一直 emerald，别改成 green；色值给 **2–3 个 hex**（发/衣/饰），给不了就「teal（蓝绿、中饱和）」 |
| 6 | **冻结标志物** | 一个高显著配件（银星耳环/左眉疤）当锚点，每处复述 |
| 7 | **摄影语言代替「电影感」空词** | 用「85mm 浅景深、35mm 软光 + bounce、teal-orange」；**禁用** stunning/masterpiece/epic/insane detail 这类空词 |
| 8 | **材质真实** | 布料要缝线/褶皱/磨损，皮肤软光微反射，加瑕疵（灰尘/做旧）；避免塑料感 |
| 9 | **版式与背景** | 白底 / 米黄纸纹 / 浅灰；ID 块简约大胆（仅 名称/角色/核心情绪/视觉标志）；手写注释**短而硬**（「柔软蕾丝」「色号#520」） |
| 10 | **负向约束** | no view merge（视角不合并）、no stacked poses、no hidden/extra limbs、no cropped body、除 ID 块外 no text overlay |

**喂图机制（同样兜底）**：基准图权重 ~80%；**≤6 张** 高质量 1024² 参考；做变体**锁 seed**；固定视点（如统一 3/4 eye-level）减少飘脸。

**翻车 → 修法速查**：
| 症状 | 修法 |
|---|---|
| 飘脸 | 加「exact same facial features」+ 减风格变化 + 固定视点 |
| 服装漂移 | 精确写材质/颜色/关键单品 + 「same outfit」 |
| 三视图透视各异 | 「比例一致、避免夸张透视」+ 「每个视角是独立干净研究、非场景帧」 |
| 角色被合并/糊一团 | 「每个视角清晰分离、有呼吸空间、不堆叠」+ 负向 no merge |
| 出一堆人脸/泛化 | 单图 ≤5 个角色；超了身份 latent 崩 |

### §5.7.1 实测追加（2026-06-06，直连 kie 验证后）—— 推翻两条早期假设

> 实测两轮：v1 通用模板（无标注 + 通用 4 表情）vs v2（显式标注 + 剧本驱动内容）。
> 结果差距巨大，**两条早期假设都错了**——必须订正：

#### ❌ 错觉 1：「让模型自己安排标签」就够了
**实测**：v1 prompt 只说「加 ID 块」「写章节标题」类的软性要求 → 模型**完全不标**，出一张漂亮但**没文字的图**（光秃秃的 panel，下面没名字、章节没标题）。
**订正**：**每个标签必须在 prompt 里逐字列出**，并标「缺任何一项视为失败」。模板生成时要把：
- 章节大标题逐个列出（「三视图」「表情研究」「服装变体」「道具与材质」「色板」「ID 信息」）。
- 每个子图的子标签**穷举**（不是「N 个表情」而是「冷峻警戒 / 微微挑眉 / 压抑愤怒 / 苦涩自嘲 / 罕见温柔」）。
- ID 块逐行写好（姓名/代号/身份/年龄/性格/标志）。
- 色板每块 `hex + 中文角色` 写死。
- 引出线对应关系明确写（「左臂→护臂、右手→手套」）。

模板生成的 prompt 长度从 ~600 涨到 ~1000 字，**值得**——这是出图能用 vs 不能用的差距。

#### ❌ 错觉 2：「通用模板覆盖所有项目」
**实测**：v1 让模型自由选「4 个表情」→ 它给的是中性「平静/微笑/愤怒/惊讶」，**和剧本里小苏真正出现的「冷峻警戒（教室对峙）/罕见温柔（屋顶夜）/苦涩自嘲（雨夜追凶后）」毫无关系**。
**用户原话**：「通用提示词其实是没法用的，覆盖不到我们这个剧本里边需要的这些东西。」
**订正**：定妆模板必须**剧本驱动**——内容（表情/服装/道具/配色）由**当前项目实际剧本反推**，而非「合理通用清单」。

#### 剧本驱动信息源（从画布抽，不让用户重填）

| 槽位 | 真相源 | 怎么抽 |
|---|---|---|
| 角色基本信息 | 角色卡 `title` / `meta.tagline` / `meta.tags` | 直接读 |
| 表情清单 | 所有**引用了该角色的分镜节点**（`@小苏` 或连线） | 扫分镜 `prompt` 提情绪关键词（可 LLM 抽），按出现次数降序，取前 5–8 个 |
| 服装变体 | 同上 + 各分镜的场景节点 | 按场景气候/语境合并（雪夜、教室、雨夜…），不通用「校服/便服/雨衣」 |
| 道具/装备 | 剧本/分镜中提及的物件 | LLM 抽取「该角色用到/穿戴」的实体名 |
| 配色 hex | 该角色主形象 → 边缘检测主色 | 取主色 / 辅色 / 点缀色 hex |
| 世界观 / 引文 | 项目 README / 剧本梗概 + 角色 bio | 直接拼或 LLM 摘要 |

**面板里只让用户做两件事**：① 看 / 微调系统从剧本反推出的清单（删某个、加某个）。② 选风格行 + 确认花额度。**绝不再让用户手填一个"通用 4 表情"**。

#### 落地待办（覆盖 §3 数据模型）
- [ ] 提示词模板生成器：用项目剧本上下文 + 角色身份块 → 拼出含逐字标注的 prompt（参考 `tests/ux/kie-direct-image2-v2.mjs`）。
- [ ] 剧本上下文抽取器：扫分镜节点引用 + 场景节点，按角色聚合（新 selector，住 `runner/` 或 `assets/`）。
- [ ] 定妆面板加「剧本反推」预览区：把抽到的清单展示给用户调整。
- [ ] 「项目缺剧本上下文怎么办」回退：当角色没被任何分镜引用时，明确提示用户「先用这个角色画几个分镜，定妆才有可参考的情绪/服装/道具」——而非默默套通用模板生出用不上的图。

来源：本会话直连 kie 实测，两张对比图存于 `tests/ux/shots/kie-image2-result.png`（v1 无标注）和 `kie-image2-result-v2.png`（v2 标注 + 剧本）。

### 我们的模板 = 脚手架（始终注入 1–10）+ 用户勾的区块 + 风格行 + 基准图

```
[1 人设] 你是顶尖概念美术大师，擅长像素级拆解的角色身份板。
[4 身份tag] {角色名}｜{核心特征 8 词}｜{标志物}
[2 布局] 中心放英雄全身立绘当锚点，周围不对称排列以下区块，干净间距、引导线连接，绝不用网格：
  └─ 按用户勾选拼接 → {英雄全身}{三视图正/侧/背}{表情×N}{动作姿态}{轮廓剪影}{装备拆解}{色板}{ID块}
[3 身份锁定] 所有视角相同面部/比例/发型/服装/体型/姿势语言/视觉个性。
[5/6] 配色 {hex×3}；标志物 {accessory} 每处复述。
[7/8/9 风格] {风格行：电影感/日系厚涂/赛博…}；{摄影语言}；米黄纸纹背景；手写短注释；ID 块仅名称/角色/核心情绪/标志。
[10 负向] 不合并视角、不堆叠、不裁切肢体、除 ID 块外无文字。
[基准图] {主形象，权重 80%}
```

> **关键：1–10 由我们写死调优，用户永远只碰「勾区块 + 选风格 + 给图」三件事。** 这正是「不让用户手搓」。

### 模型选型（出身份板用哪个）

| 模型 | 适配 | 依据 |
|---|---|---|
| **Nano Banana Pro / GPT-Image-2** | **主力** | 强指令跟随（7–8 约束）、多面板布局、身份保持 95%；GPT-Image-2 能可靠执行「一大 + N 不对称面板」 |
| 即梦 4.0 | **不出身份板** | 不支持多图参考、复杂任务掉链子；强在中文封面排版（下游用） |
| Seedream / Vidu Q1 | 备选 | 多图参考（Vidu 7 图），介于两者 |

> 落地：定妆模式在 `modelArchetypes` 声明「需要会布局多面板 + 多图参考」的能力标记；
> 选模型时优先这类，认不出走通用回退（单图、提示降级为简单三视图）。

来源：[prompting.systems · NB Pro 一致性指南](https://prompting.systems/blog/nano-banana-pro-character-consistency-guide)、
[selfielab · 5-part 身份锁定框架](https://selfielab.me/blog/nano-banana-pro-master-character-consistency-prompts-20260219)、
[Tharindu · 20 角色设计提示词](https://tharindumanujaya.com/nano-banana-pro-prompts-for-character-design/)、
[fal.ai · GPT-Image-2 提示指南](https://fal.ai/learn/tools/prompting-gpt-image-2)、
[OpenAI cookbook · 图像生成提示](https://developers.openai.com/cookbook/examples/multimodal/image-gen-models-prompting-guide)、
知乎「像素级拆解」Nano Banana Pro 模板、[ZHO-nano-banana-Creation](https://github.com/ZHO-ZHO-ZHO/ZHO-nano-banana-Creation)。

---

## §6 开放问题（实现前需定 / 评审中收敛）

1. **切片方式**（5.A）：用户手动框选 vs AI 自动切（需要会读图的模型）。先做手动，AI 切作增强。
2. **默认固化的 slot 清单**：角色给哪几个槽默认勾选（正/侧/背 + 3~5 表情？）；场景给哪几个时段。
3. **额度**：固化是「花额度真实生成」，按操作手册 A 属于需用户拍的不可逆动作 → 生成前确认。
4. **与变体链关系**：`outfit` 服装变体 vs 现有 `regeneratedFrom` 变体链是否合并语义（避免两份真相源）。

---

## §7 验收门（实现后）

- [ ] 角色 / 场景固化态走**同一个** `<FixationSheet>` 组件（无并行版）。
- [ ] sheet 子图进 `useAssetPool`，下游 AssetPicker 能取到「角色-侧面」。
- [ ] 固化生成模式住 `modelArchetypes`，认模型身份、与供应商解耦。
- [ ] Prompt 模板含「比例一致 / 保持同一张脸」保命句。
- [ ] 真机逐态视觉走查（规则 13）+ design-fidelity 几何实测遮挡（CLAUDE.md D 纪律）。
- [ ] 与获批样张逐项对账（规则 8 AFTER 步）。
