剧情美术规划(立绘 + 场景背景)
老大 2026-09-23 需求: 「有几个点没有角色人物的形象。在对话的时候,我们一定要有角色人物形象出来; 同时,不同章节的场景不同,在对话时也要对应绘制出不同的背景图, 且风格要跟我们保持一致」 「1. 角色形象:把所有有对话的角色全部整理出来…谁在说话,就显示谁的人物形象。 2. 场景背景:整理出每一次对话所需的场景背景(同一场景内背景保持一致, 切换场景时则需更换)」 「先…通过 AI 生成一两张图片测试风格。如果风格合适,展示给我看,我再确定是否继续」
一、结论先行
| 项 | 数量 | 说明 |
|---|---|---|
| 角色立绘 | 28 张(27 位角色) | 掌门要男/女两版 ⇒ 27 位出 28 张 |
| 场景背景 | 29 张 | 覆盖全部 60 章(每章都有背景,无缺口) |
| 合计 | 57 张 | 按每张 4 个候选 ≈ 57×4×0.2 ≈ 46 元 |
🔴 清单不是手写的:由 tools/gen_story_art_plan.py 从 mainline.json 现算生成 game/data/story_art.json(句数 / 出场章节 / 地点覆盖全部自动统计)。 改剧情后重跑那个脚本即同步 —— 手写一份清单等于给主线数据立第二份真相源, 迟早悄悄过期。
二、角色清单(27 位 → 28 张)
🔴 先说最要紧的一件事:"谁是十几个人"
27 位里有 13 位是中年上下的男性掌门 / 教主 / 长老 (岳不群、余沧海、左冷禅、任我行、东方不败、莫大、黑白子、上官云、 魔教堂主、嵩山派黑衣客、绿竹翁、药王庙住持、青城派头目)。
而 3D 战场模型只有 12 个 —— chr_master_01 被 5 人共用、chr_elder_01 被 6 人共用。 ⇒ 如果立绘也画得大同小异,玩家在对话里根本分不清是谁在说话, 而这正是这次要解决的问题。
⇒ 每位角色都定了一个"一眼可辨的视觉锚点",优先用身材 / 衣服颜色 / 手里拿的东西 (这三样在缩小后最扛得住)。锚点之间不许撞车(脚本会检查重复)。
P0 · 核心(13 位,出场最多)
| 角色 | 身份 | 台词 | 视觉锚点 |
|---|---|---|---|
| 令狐冲 | 华山派大弟子 | 181 | 束发布带(不戴冠)+ 腰间长剑 + 常带笑意的嘴角 |
| 任盈盈 | 日月神教圣姑 | 24 | 浅碧绿衣 + 怀中古琴 + 极静的神情 |
| 林平之 | 福威镖局少镖头 | 20 | 残破带血的少年 + 死攥着剑的手 |
| 岳不群 | 华山派掌门 | 15 | 白净面容 + 整齐方巾 + 折扇(「君子剑」的表象) |
| 任我行 | 日月神教教主 | 14 | 蓬乱花白须发 + 苍白面色 + 奇大的手掌 |
| 田伯光 | 万里独行 | 11 | 痞笑露白牙 + 短把快刀 + 赭红劲装 |
| 余沧海 | 青城派掌门 | 10 | 🔴 明显矮小 + 鹰目锐利 + 深青近黑道袍 |
| 婆婆 | (实为任盈盈) | 9 | 花白鬓发 + 灰褐粗布 + 竹帘遮面 |
| 左冷禅 | 嵩山派掌门 | 8 | 🔴 高大魁梧 + 须发半白 + 阴沉方脸 |
| 向问天 | 天王老子 | 6 | 虬髯 + 腕上粗铁环 |
| 岳灵珊 | 华山派小师妹 | 5 | 双丫髻 + 竹食盒 + 笑嘻嘻 |
| 东方不败 | 日月神教教主 | 3 | 🔴 大红绣花袍 + 指间绣花针(全场最好认) |
| 掌门(玩家) | 本派掌门 | 71 | 深色锦袍 + 束发戴冠 ⇒ 男/女两版 |
📌 表里两处 🔴 是刻意做成一对反例:余沧海「矮」、左冷禅「高」, 两个掌门只用身高就能分开(这也是原著特征)。
P1 · 重要配角(11 位)
| 角色 | 身份 | 台词 | 视觉锚点 |
|---|---|---|---|
| 药王庙住持 | — | 5 | 赭黄袈裟 + 手中药罐(侧头听人 = 耳朵背) |
| 嵩山派黑衣客 | 暗处的爪牙 | 5 | 🔴 黑布蒙面(只露眼睛) —— 全场唯一不露脸 |
| 魔教堂主 | 教中老堂主 | 5 | 深红近黑袍 + 金线纹饰 + 乌木杖 |
| 青城派头目 | — | 4 | 深青短打 + 腰挎单刀 |
| 魔教剑手 | — | 4 | 黑红劲装 + 双手横剑的姿态 |
| 绿竹翁 | 绿竹巷主人 | 3 | 🔴 宽檐竹笠 + 背上竹篓(篓里插竹枝) |
| 黑白子 | 梅庄四友 | 3 | 🔴 黑白两色袍 + 指间棋子 |
| 莫大先生 | 衡山派掌门 | 2 | 旧胡琴 + 干瘦 + 半阖的眼 |
| 定闲师太 | 恒山派掌门 | 2 | 🔴 尼姑装(光头 + 僧衣)+ 念珠 |
| 岳夫人 | 华山派掌门夫人 | 1 | 素银簪 + 目光笔直 |
| 上官云 | 日月神教长老 | 1 | 🔴 皮甲护肩(全场唯一穿甲的)+ 短髯如戟 |
P2 · 龙套(3 位,各只出现 1 章、2 句)
| 角色 | 台词 | 视觉锚点 |
|---|---|---|
| 客栈掌柜 | 2 | 肩上的白抹布 |
| 老船家 | 2 | 旧斗笠 + 长竹篙 |
| 镖局老仆 | 2 | 前襟带镖局标记的旧短褂 + 驼背 |
两个特殊说明
婆婆与任盈盈是同一个人 —— 第 41 章《圣姑》揭破她是日月神教圣姑。
两版立绘差别必须够大(老/少、灰褐/浅碧绿、佝偻/挺秀), 否则「揭破」那一幕没有冲击力。这是整个第四层的戏眼。
- 掌门(玩家自己) 名字与性别都取玩家存档 ⇒ 只需男/女两版,
是全清单里唯一需要多版本的角色。
老樵夫在人物表里、但一句台词都没有(备用角色)⇒ 不做立绘。
三、场景清单(29 张 · 覆盖 60 章)
🔴 归并的判据是「视觉上是否明显不同」,不是「文字上是否同一个词」:
- 「山门 · 门房」「议事堂」「厢房」「库房」文字上是四个地点,
画面上都是"门派院内一间简朴屋子" ⇒ 合成一张;
- 「思过崖(露天崖顶)」与「思过崖后洞(石洞内)」只差两个字,
但画面完全不同 ⇒ 必须分开。
门派(4)
| 场景 | 章 | 气氛 |
|---|---|---|
| 山门 · 雨夜门房 | ch1 | 深夜 · 大雨 · 门檐一盏灯笼 ★ 开篇 |
| 山门 · 厨房灶间 | ch2 | 深夜 · 灶火 · 暖 |
| 山门 · 厅堂(议事) | ch5~46(5 章) | 室内 · 灯烛 · 静 |
| 山门 · 石阶山门 | ch12、ch60 | 清晨 · 雨后初晴 ★ 与 ch1 呼应 |
野外与路上(9)
| 场景 | 章 | 气氛 |
|---|---|---|
| 官道 | ch3~43(4 章) | 白天 · 尘土 · 行人稀疏 |
| 野外 · 竹林 | ch7~42(3 章) | 日间 · 竹影 · 有杀气 |
| 黑风口 · 乱石坡 | ch4 | 黄昏 · 风砂 · 荒凉(★ 那块无字碑是戏眼) |
| 城外 · 破窑 | ch9 | 日间 · 荒废 · 阴暗 |
| 福州 · 城外破庙 | ch14 | 雨夜 · 荒废 · 凄清 |
| 山中 · 山神庙 | ch45 | 山雨 · 逼仄 · 情动(★ 那盏油灯是核心) |
| 山下 · 集镇 | ch33 | 白天 · 热闹 · 市井 |
| 五霸冈 | ch44 | 聚义 · 山坡 · 酒气 |
| 洛阳城外 · 夜路 | ch40 | 夜 · 旷野 · 月 |
福州(7)
| 场景 | 章 | 气氛 |
|---|---|---|
| 福州 · 码头 | ch15 | 清晨 · 江雾 · 湿 |
| 福州 · 福威镖局旧址 | ch16 | 阴天 · 废墟 · 死寂(★"青砖被撬过"是线索) |
| 福州 · 城南盐仓 | ch17 | 夜 · 仓储 · 幽暗 |
| 福州 · 客栈 | ch18 | 夜 · 客房 · 灯下 |
| 福州 · 城西祖屋门外 | ch20、ch23 | 夜 · 巷陌 · 逼仄 |
| 福州 · 药王庙 | ch21~24(3 章) | 晨昏 · 庙宇 · 香火 |
华山(3)
| 场景 | 章 | 气氛 |
|---|---|---|
| 华山 · 思过崖 | ch25~34(5 章) | 高崖 · 云海 · 孤绝 ★ 第三层主舞台 |
| 华山 · 思过崖后洞 | ch26~36(4 章) | 洞窟 · 幽深 · 神秘(★ 石壁剑痕) |
| 华山 · 山道石阶 | ch27、ch35 | 山间 · 险峻 · 开阔(★ ch35《下山》) |
洛阳(2)
| 场景 | 章 | 气氛 |
|---|---|---|
| 洛阳 · 绿竹巷 | ch37~47(5 章) | 静巷 · 竹影 · 琴声 ★ 爱情线主舞台 |
| 洛阳城外 · 夜路 | ch40 | 夜 · 旷野 · 月 |
西湖 · 梅庄(3)
| 场景 | 章 | 气氛 |
|---|---|---|
| 西湖 · 梅庄 | ch49 | 庄园 · 雅致 · 暗藏杀机 |
| 梅庄 · 西湖底黑牢 | ch50 | 地底 · 幽囚 · 死寂(★ 压抑感是任务) |
| 西湖 · 夜舟 | ch51、ch52 | 夜 · 湖上 · 空阔 |
嵩山 · 黑木崖(3)
| 场景 | 章 | 气氛 |
|---|---|---|
| 嵩山 · 封禅台 | ch53~56(4 章) | 大会 · 高台 · 风 |
| 黑木崖 · 山道 | ch48、ch57 | 险道 · 铁索 · 肃杀 |
| 黑木崖 · 崖顶大殿 | ch58、ch59 | 崖顶 · 大殿 · 空寂 ★ 最终决战 |
四、出图规格与技术链路
🔴 第二版(2026-09-23 老大看过试作后的四条反馈)
| # | 老大的话 | 落点 |
|---|---|---|
| 1 | 「人还是不要用那种纯黑白色的,要有颜色,但是饱和度不需要太高」 | STYLE_PORTRAIT 追加"色彩要求"段 |
| 2 | 「背景做得还不错,背景放满全幅画布」 | CSS .st-bg 用 object-fit: cover 满幅 |
| 3 | 「人物的抠图一定不要把人物身体上部分的色彩都给抠掉了,只是把身体四周的背景给抠掉」 | 🆕 tools/make_story_art.py(窄阈值 20 + 不放宽掩码) |
| 4 | 「对话框和人物的摆布还是要延续现在的界面。人物放在对话框的正上方就行了,而不是放在左边」 | CSS 改成竖向堆叠(立绘居中 → 对话框 → 底栏) |
第 1 条:为什么"纸本设色"会出黑白人物
STYLE_CORE 里写的是「纸本设色质感,颜色是沉稳的矿物色」—— 这对道具 / 建筑恰到好处,但对人物,模型把"沉稳"读成了"用墨色就行" ⇒ 出了一批近乎黑白的水墨人物。
⇒ STYLE_PORTRAIT 在画风内核之后追加一段(不能只改内核,那会脱离同族):
- 「人物必须是彩色的,不要画成纯黑白的水墨或线描」
- 「整体饱和度偏低、色调柔和雅致(淡彩设色,不是浓抹重彩)」
- 「画面里要有明确的主色(青 / 褐 / 赭 / 黛)」
📌 两句缺一不可:只说"有颜色" ⇒ 艳俗手游配色;只说"沉稳" ⇒ 回到黑白。
第 3 条:抠图为什么必须换工具
make_equip_icon.py 的抠图把掩码放宽到 2.2 倍色距(≈70)—— 那是为了吃掉 AI 给图标画的浅灰衬纸框。代价是人物身上浅色的衣料会被一起吃掉。
实测同一张立绘、两套参数(这是老大那条要求的量化证据):
| 方案 | 透明占比 | 吃掉非背景像素 |
|---|---|---|
1 图标口径 tol=32 + 放宽 2.2× | 56.9% | 0.304% |
2 立绘口径 tol=20 + 不放宽 | 49.3% | 0.007% |
⇒ 新口径把"啃到人物"的量降到 1/43,且少抠掉的 7.6% 正是人物身上的浅色。
判据:eaten_color_ratio(被抠掉、却明显不是背景色的像素占比)< 1%。 可视化:--check 出检查图(左原图 / 中抠后灰格 / 右红色高亮被啃掉的地方)—— 数值之外再给人眼一个证据。
第 4 条:布局从"左右分栏"改成"竖向堆叠"
┌─ 顶信息条(章节 / 地点 / 关闭) z-index 3
├─ 【立绘区】居中、紧贴对话框上沿 z-index 2(flex:1 自动吃掉剩余高度)
├─ 【对话框】居中 + 半透明深底 z-index 3
└─ 底操作条(跳过 / 继续) z-index 3
背景满幅铺满(object-fit: cover) z-index 0
🔴 立绘在框的"正上方"= 竖向堆叠的两块,不是"绝对定位压在框上": 前者脸永远不会被框挡住(框一高就糊住人,正是要改掉的); 后者是"放在左边"那种做法的变体。
🔴 立绘高度 max-height: 82%(不是顶满)——顶满会把场景挡得只剩一条边 (雨夜那张的门房、屋瓦、灯笼都在人物身后)。这一条只能在完整画面里定。
风格来源(🔴 项目铁律:不许另起炉灶)
风格来源(🔴 项目铁律:不许另起炉灶)
所有风格句从 tools/art_style.py 取(美术风格唯一真相源):
| 新增的风格句 | Purpose |
|---|---|
STYLE_PORTRAIT + NEGATIVE_PORTRAIT | 人物立绘 |
STYLE_SCENE + NEGATIVE_SCENE | 场景背景 |
两者都复用 STYLE_CORE(中国工笔白描 · 纸本设色 · 墨线勾轮廓)与 SUBJECT(中式武侠题材), 与作品里已有的 111 张图标(装备 / 建筑 / 境界 / 按钮)同族。
尺寸
| 类型 | 尺寸 | 理由 |
|---|---|---|
| 立绘 | 1024x1536(竖 2:3) | 与对话界面里立绘的竖向位置匹配 |
| 场景 | 1536x864(横 16:9) | 对话层是全屏层,16:9 铺满时裁切最少 |
两个关键设计(这两条决定"能不能用")
- 立绘必须能抠成透明底 —— 它要叠在场景图上。
走的还是项目既有的"白底出图 → 抠白"链路(make_equip_icon.py)。 🔴 能抠干净靠的是工笔白描的"墨线勾边"这个画风特性 ⇒ 风格句里把 「外轮廓用浓墨勾一整圈闭合的线」单独强调。 ⚠️ 场景图不抠(它就是要满画面)—— 抠了会把整片天空抠掉。
- 场景图的下半部要留空 —— 对白文字压在画面下半部。
若那里塞满细节,文字压上去根本读不清,而且不报错(图很好看,只是字看不清)。 ⇒ 风格句里明说「下半部刻意简洁」+ 前端再叠一层渐变遮罩(双保险)。
风格来源(🔴 项目铁律:不许另起炉灶)
所有风格句从 tools/art_style.py 取(美术风格唯一真相源):
| 风格句 | Purpose |
|---|---|
STYLE_PORTRAIT + NEGATIVE_PORTRAIT | 人物立绘 |
STYLE_SCENE + NEGATIVE_SCENE | 场景背景 |
两者都复用 STYLE_CORE(中国工笔白描 · 纸本设色)与 SUBJECT(中式武侠题材), 与作品里已有的 111 张图标(装备 / 建筑 / 境界 / 按钮)同族。
⚠️ 但不能只靠公共句——两处都踩过:
STYLE_PORTRAIT必须追加"色彩要求"(否则"沉稳矿物色"被读成"别上色");- 两者都不能引用
NO_JUNK(它含「无人物」,与立绘/场景都矛盾)。
📌 通用构件在不同题材里含义可能相反,共用就会得到自相矛盾的提示词。
尺寸
| 类型 | 尺寸 | 理由 |
|---|---|---|
| 立绘 | 1024x1536(竖 2:3) | 与对话界面里立绘的竖向位置匹配 |
| 场景 | 1536x864(横 16:9) | 对话层是全屏层,16:9 铺满时裁切最少 |
两个关键设计(这两条决定"能不能用")
- 立绘必须能抠成透明底 —— 它要叠在场景图上。
🔴 能抠干净靠的是工笔白描的"墨线勾边"这个画风特性 ⇒ 风格句里把 「外轮廓用浓墨勾一整圈闭合的线」单独强调。 ⚠️ 抠图不能用图标那套工具(会把人物压成 96×96、还会吃掉浅色衣料) ⇒ 见 tools/make_story_art.py 与上面第 3 条。 ⚠️ 场景图不抠(它就是要满画面)—— 抠了会把整片天空抠掉。
- 场景图的下半部要留空 —— 对白文字压在画面下半部。
若那里塞满细节,文字压上去根本读不清,而且不报错(图很好看,只是字看不清)。 ⇒ 风格句里明说「下半部刻意简洁」+ 前端再叠一层渐变遮罩 + 对话框半透明深底(三重保险)。
生产链路
tools/gen_story_art_plan.py # 1 从 mainline.json 算出清单 → game/data/story_art.json
↓
tools/gen_story_art.py # 2 出图(读清单 + 取风格句)→ _tmp/story_art/
↓
tools/make_story_art.py --pick # 3 挑图(记录 picks.json —— "最终选了哪张")
tools/make_story_art.py --install # 4 处理并安装 → game/assets/story/
↓
gamenet/mainline.py # 5 后端:place → 场景 id、cast → 立绘图名(唯一翻译处)
↓
web/frontend/src/ui/years.js # 6 对话层按 who / scene 渲染立绘与背景
命令
python tools/gen_story_art_plan.py # 生成/刷新清单
asset-forge/backend/.venv/Scripts/python.exe tools/gen_story_art.py --probe # 试出风格
asset-forge/backend/.venv/Scripts/python.exe tools/gen_story_art.py --all --tier P0
asset-forge/backend/.venv/Scripts/python.exe tools/make_story_art.py \
--pick "linghuchong=01,scene:shanmen_rain=01" # 挑图(场景加 scene: 前缀)
asset-forge/backend/.venv/Scripts/python.exe tools/make_story_art.py --install --check
五、分阶段计划
| 阶段 | 内容 | 张数 |
|---|---|---|
| 1 试作(本轮) | 令狐冲立绘 + 山门雨夜场景,各 4 候选 | 2 |
| 2 定风格后 | P0 角色 13 位(含掌门两版)+ 高频场景 12 张 | ~27 |
| 3 补齐 | P1/P2 角色 + 剩余场景 | ~30 |
| 4 接线 | 对话层按说话人显示立绘、按地点换背景 | — |
估算:每张约 0.2 元(4 候选约 0.8 元)⇒ 57 张全程约 46 元。
六、进度(2026-09-24 完成)
✅ 57 张全部出齐并入库
| 数量 | 说明 | |
|---|---|---|
| 角色立绘 | 28 张 | 27 位角色(掌门男/女两版) |
| 场景背景 | 29 张 | 覆盖全部 60 章 |
| 合计 | 57 张 | 入库 game/assets/story/ |
实际花费 ≈ 24 元(批量 21.6 + 重出 2 张立绘 1.2 + 重出 2 张场景 1.2)。
生产过程中"自动挑图"的边界(值得记)
批量出图是 55 张 × 2 候选 = 110 张,人工挑不现实 ⇒ 写了 --auto-pick(打分挑图 + --overview 总览图)。这一轮把它的能力边界 摸清了:
| 能自动判(进打分) | 判不了(交给人看) |
|---|---|
| 啃边率(抠图吃没吃到人物) | 内容对不对(如"后洞该是洞内"画成了洞外) |
| 居中度(人物歪没歪) | 审美(好看不好看) |
| 饱和度(老大要「有颜色」) | 是否被裁(贴边是半身像的常态,分不出"刚好画到边"还是"被切掉") |
| 场景下半部简洁度(对白可读性) | 场景亮度(室外亮是对的,判不了室内室外) |
🔴 本轮靠"人眼看总览图"抓出 4 张要重出的:
dongfang_bubai饱和度 0.036(该穿大红绣花袍,画成了黑白)mo_da饱和度 0.067scene_huashan_cave画成了洞外风景(该是洞内石壁剑痕)scene_heimuya_top看不出是殿内(该有"空宝座")
⇒ 前两张是打分器抓的(补上"饱和度"这条判据之后),后两张只能靠看。
📌 教训:机器判能判的,人判该人判的;判不了的别硬判 (本轮就写了三条"看着能判、其实没区分力"的假判据,全删了 —— 假判据比没有判据更糟,它会理直气壮地挑错)。
还剩什么
- 接线已完成:后端
place → 场景、cast → 立绘,前端按说话人亮暗 - 线上未发布:这次只改了本地,未推
http://[服务器地址]/
🔴 若要重出某一张
# 1) 改描述(tools/gen_story_art_plan.py 里那个场景/角色的 look)
python tools/gen_story_art_plan.py # 重生成 spec
asset-forge/backend/.venv/Scripts/python.exe tools/gen_story_art.py --portrait dongfang_bubai --n 3 # 或 --scene <id>
# 2) 重挑(会保留人工确认的)并出总览
asset-forge/backend/.venv/Scripts/python.exe tools/make_story_art.py --auto-pick --overview
# 3) 满意就装
asset-forge/backend/.venv/Scripts/python.exe tools/make_story_art.py --install
⚠️ 想手工指定某一张:--pick "<角色id>=<完整文件名>"(写 picks_manual.json, 自动挑图不会再改它)。场景的键要带前缀:scene:<场景id>。