20 风格
paint ✅ · anime 🧪 · 油画 📐
「一笔笔画」和画风是正交的
同一套架构(矢量管边,笔画管里面),只是把预算分配到不同的笔上:
| 边 | 色阶 | 主要的笔 | 效果 | |
|---|---|---|---|---|
| 印象派 / 油画 | 笔画自己的边 | 无 | 不透明粗笔,沿梯度法线走 | 方向性涂抹 |
软调厚涂(paint) | 矢量 | 2–5 档 | airbrush + 半透明细节笔 | 水粉感 |
二次元(anime) | 矢量 | 2–5 档 | 收尖发丝 + 线稿 + 排线,几乎不用 airbrush | 赛璐璐 |
本书最早的原型(从黑画布开始、多尺度贪心、不透明笔、直接涂合成图)出来就是标准的印象派油画——顺着形体的方向性涂抹,很明显。那是错的美术风格,被推倒重来。但这条路是通的,代码路径还在 strokes.detail() 里:把 opacity 拉回 1.0、半径放大、关掉矢量色阶层就是。
paint(默认)✅
第 1 章的数字就是它。1:1 下有厚涂味,来自三件事:airbrush + 铅笔的软边半透明堆叠;detail 那约 3.9 万笔本质是 Hertzmann 的印象派算法;参考画的招牌痕迹几乎没有(发丝 2,700 笔全在头发,排线 190 笔,线稿关闭)。
anime 🧪
ART_STYLE=anime ./paint trace。改的是预算分配:
| paint | anime | |
|---|---|---|
soft | 两遍,opacity 0.22 / 0.18 | 只在大块(>12000 px)上一遍,opacity 0.10 |
detail | R = 6 / 3 / 1.5,opacity 0.6 | R = 3 / 1.5,阈值 ×2.2,opacity 0.4 |
strand | 每 55 px 一根 | 每 16 px 一根(9,108 笔) |
hatch | 间距 3 | 间距 2 |
line | 关 | 从轮廓曲线生成(1,174 笔) |
跑过三轮,状态:
| 轮 | 变化 | p99(归一 2508) | 色数 | 问题 |
|---|---|---|---|---|
| 1 | 首版 | 17.6 | 2089 | 线太粗太重(荷叶边一串香肠);soft 被单笔 taper 字段覆盖成全压强,整张糊 |
| 2 | 线细一半、回退 taper 覆盖 | 20.6 | 2389 | 仍软 |
| 3 | 关掉 airbrush | 20.4 | 2375 | 没变——soft 不是元凶 |
第三轮的发现是这一部最后一条线索:发丝和线稿用的 c) Pencil 1 Sketch (mypaint) 是全场最软的笔(过渡宽度 W=3.25,probe_taper 里最大)。它的 aliased 0.0% 是因为软,不是因为利。用最软的笔去画本该最锐的东西。 候选替代是 c) Pencil-3 Large 4B(W=1.25、圆度 0.916、收尖 0.18,都实测过)。没跑——写书时停在这里。
第三轮。发丝有了,线稿有了,但整体软。
两版并存
work/archive/trace-origin-v5.0.0-软调厚涂-*/ 存着 paint 风格的完整成品和 README;work/output/trace-origin-anime/ 是 anime 第三轮。同一套代码,两个 ART_STYLE,可以直接对比。
一条回归
第 1 轮的「整张糊」是我自己造成的:让规划器每一笔的 taper 字段覆盖 KIND 表的默认。soft 从「压感 0.1→1→0.1 的轻扫」变成全压强铺满。规划器的 taper 字段只是它自己模拟时用的形状标记,不是给 Krita 的指令——现在 job_trace.py 里 taper 由笔种决定,单笔不覆盖。