美术风格设定
老大 2026-09-22: 「日志、Jianghu、营造这几个按钮都需要调用 AI 来绘制,按钮的绘制要统一好风格, 放入美术风格设定中,之后绘制都需要使用,以保持一致。」
这份文档讲"为什么"。风格句的正文在 tools/art_style.py(唯一真相源)。
一、为什么风格句是代码,不是这段文字
一致性靠"人记得去抄同一段话"是靠不住的:只要有人新起一个出图脚本、 顺手自己写一段画风描述,两批图就不再有同一个"底子"—— 而且不会报错, 只会让两批图放在一起时"看着有点不像",等发现时已经出了几十张。
⇒ 所以把风格句固化成 tools/art_style.py,所有出图脚本 import 它:
sys.path.insert(0, str(Path(__file__).resolve().parent))
from art_style import NEGATIVE, SIZE, STYLE_UI # 界面按钮图标
from art_style import STYLE_ITEM # 道具 / 装备图标
新写一个出图脚本时只有一条正确路径:从 art_style 取,别自己拼。
🔴🔴 改动纪律:公共风格句逐字冻结
STYLE_ITEM 的结果串逐字等于 2026-09-22 定稿的那一版(191 字,已机器核验)。 一个字符都不许动。
理由:已出的 60 张装备图标是照那一版出的。公共句一改,新老两批图就不在同一套约束下了 —— 而它们不会被重跑,于是你会得到一批"只在新图里生效的规则", 两批图的差异变成无法解释的。
要修某一张的毛病,用逐张补丁(见下),别动公共句。
二、风格内核(所有资产共用)
| 维度 | 设定 | 为什么是它 |
|---|---|---|
| 题材 | 中式武侠 | 全资产挂在同一题材下 —— "一家人"的第一层保证 |
| 画风 | 中国工笔白描 · 纸本设色 | Seedream 默认会画成手游卡通风,要用这两个词压回国风底子 |
| 线条 | 墨线勾轮廓、干净利落 | 图标要缩到 22~26px,细若游丝的线会消失 |
| 色彩 | 沉稳的矿物色,不要荧光滑面 | 与界面的纸色/墨色同族(#F5F1E8 纸 / #2b2622 墨) |
| 背景 | 纯白 #FFFFFF,无渐变/投影/底纹/场景 | 为了后面抠白成透明(底色与边框改由 CSS 画,品质色才准) |
| 边框 | 不许画任何方框 / 圆角边框 / 底牌 / 衬纸 | AI 会自作主张加自己的框,与 CSS 画的边框打架 |
| 杂物 | 无水印、无文字、无签名、无人物、无地面 | 图标就是那个东西本身 |
🔴 三条"必须把话说满"的禁止项(都是试生成后才定下来的)
- 「画面的四条边直接就是纸的白、没有任何界线」
—— 光说"物品周围不要框"不够:AI 会把它理解成"物品的框", 然后给整张画布画一圈边线(实测 3 张候选全中)。 后果不只是难看:那圈线挡住抠白 —— 抠白是从四角向内做连通判定的, 框把四角的白与框内的白隔开 ⇒ 框内那片白被当成"物体"留下 ⇒ 图标带一块不透明白方块。
- 「物品之外必须是一整片干净的纯白,不要任何墨渍、水渍、晕染、洇开」
—— "纸本设色"这五个字会让 AI 在物品之外甩一圈淡水渍(它觉得那样更"水墨")。 实测只在圆形物体上出现(罗盘),方形物体(簿子/角尺)没中 ⇒ 凡是"只在部分样本上出现"的毛病,都要写进公共句,别赌下次不中。
- 「不要底座、不要影子、不要地面」
—— 立起来的物体,AI 会自动给它补一片地面投影。那是它的笔画, 抠白救不了(会残留一块灰)。实测:竖立的簿子连续两轮都带左下阴影。
各类资产的差异(只改"画什么"和"占多大",别另起炉灶)
| 资产 | 风格句 | 与道具图标的差别 | 为什么 |
|---|---|---|---|
| 道具 / 装备图标 | STYLE_ITEM | 主体占 62%、四周留白均匀 | 一整套 60 张,居中留白看着舒展 |
| 界面按钮图标 | STYLE_UI | 主体占 78%(几乎顶满)<br>象征性强、造型简洁、笔画粗壮 | 按钮上只有 22~26px:留白多了显得虚;繁复细节会糊成一团墨点 |
| 建筑图标 | STYLE_BUILDING | 主体占 62%(同道具档,不是 78%)<br>禁纹饰:柱墙光素、屋面只画瓦垄<br>外轮廓要彼此有区别 | 建筑是有内部结构的复杂物体,撑到 78% 会逼 AI 加装饰填空间(实测柱身长满云纹);而 27 座要并排放在一条坞里,互相可分比写实重要 |
三、出图流程(两类资产同一套流水线)
1 生成(白底 JPG)
tools/gen_equip_icons.py --all # 装备图标 60 张
tools/gen_ui_icons.py --all # 界面按钮图标
↓ _tmp/<类别>_icons/ + manifest.json
2 抠白 + 缩到 96px 透明 PNG
python tools/make_equip_icon.py --manifest --src _tmp/<类别>_icons
↓ game/assets/ui/icons/<name>.png
3 前端引用
装备:ui/equip_card.js#equipIconFile() → icons/<part>_<tier>.png
按钮:index.html 的 <img class="btn-art"> → icons/ui_<key>.png
🔴 必须用 asset-forge/backend/.venv 的解释器(要 httpx / python-dotenv)。
🔴 命名:三处必须逐字一致
| 处 | 文件 |
|---|---|
| 生成 | gen_equip_icons.py#job_name() / gen_ui_icons.py#icon_name() |
| 落盘 | game/assets/ui/icons/*.png |
| 引用 | equip_card.js#equipIconFile() / index.html 的 src |
对不上时不会报错,只会静默回落成 SVG / 空白 ⇒ 表现为"AI 图没生效"。 后端 selftest 有一条双向对账盯着它(缺哪张 / 多哪张都报)。
四、小尺寸图标的三条铁律(实测踩出来的)
- 认的是轮廓,不是细节。 按钮图标缩到 22px 时,只有外轮廓参与识别。
⇒ 提示词里必须说清"外轮廓是什么形状": 「外轮廓是一个竖直的长方形」/「一个正圆形」/「一个清晰的直角折线」。
- 姿态必须试生成才定得下来。 实录:
- 写"正面居中、稍稍侧转" → 出的是平放俯视的方形书
⇒ 缩到 22px 就是一块方块,与"文件夹/卡片"无异,认不出是簿子;
- 改成"竖立" → 轮廓对了,但带地面投影(见禁令 3);
- 再加"悬浮、无投影、封面素净" → ✅。
- 🔴🔴 约束"不要 X"时,必须同时说清「X 该去哪」(建筑图标第 3~4 轮的血泪):
建筑图标第一轮出的是"台阶下带地面阴影 + 柱间灰雾"("纸本设色"让它想做出水墨味); 我把禁止句写得越来越狠,到第三轮设色被一起去掉、成了纯线稿 —— 于是与已入库的按钮/装备图标不再同族(那批是"墨线 + 沉稳矿物色")。 ⇒ 病根:纯否定式指令会让模型走向另一个极端。 ⇒ 修法:改成正向限定落点 —— 「给屋面/墙体/台基淡淡上一层沉稳的矿物色(瓦赭红或青灰、墙土黄或米白、台基浅青灰), 只上在建筑本体上,不要给建筑之外的地方上任何颜色」。 这一句同时治好了两头的毛病(外面不再甩灰雾、里面不再丢色)。
- 物体会被词义联想污染。 实录:说"Jianghu",AI 在罗盘中央插了一把剑
(三张候选全中)—— 它被"Jianghu ⇒ 兵刃"触发的,不是被"罗盘"触发的。 ⇒ 这类杂物光靠公共句拦不住(模型不觉得那是杂物,它认为那是主题的一部分), 必须在这一张的 prompt 里明说「画面里不许出现任何兵器」。
五、以后新增资产类别
- 在
art_style.py里加一个风格句(复用STYLE_CORE/BG_WHITE/
NO_FRAME / NO_JUNK,只改"画什么"和"占多大");
- 写一个
gen_<类别>.py,from art_style import ...(不写任何画风描述); - 先
--probe出一张试生成,确认轮廓与风格 → 再--all; - 命名与前端引用逐字对齐,并把新文件登记进
selftest的图标白名单。