用 yanshi 的 MCP 笔触工具画"一笔一笔看都真实"的画 —— 大笔起手、一笔承载一块体积、用罩染代替平涂。适用于让 AI 通过 brush_stroke / medium_stroke 作画,或诊断"看起来像填色"的作品。
Recursos
1Instal·la
npx skillscat add gradetwo/yanshi/yanshi-painting Instal·la des del registre de SkillsCat.
SKILL.md
大笔起手,一笔一块体积
这份 skill 解决什么
用 yanshi 画出来的图,最常见的两种失败观感:
- 填色感 —— 像把线稿涂满。直因:用
bucket/fill_region起稿,或用大量小笔堆满区域。 - 一笔一笔看时不像手画的 —— 直因:单笔一个尺寸、一个不透明度平铺,没有起收笔、没有笔内浓淡。
∴ 问题不是引擎缺能力 ✗ —— 下面这些开关本来就有,只是没被用起来。
必须记住的六个参数(都是实测读出来的)
| 参数 | 值 | 作用 |
|---|---|---|
size |
大(覆盖笔刷自带半径,单位是直径像素) | ∴ 大笔起手靠它 |
humanize |
缺省就是 true ⇒ 别关 |
没给压力时自动套非对称起收笔包络(起 12% / 行 60% / 收 28%) |
pressure_curve |
"auto"(推荐),别用缺省的 flat |
按曲率自动分配压感 ⇒ 笔内有浓淡 |
glaze + glaze_passes |
true,遍数 3 起(8 遍饱和) |
罩染:单笔自动拆成多遍微偏移薄涂 ⇒ 皮肤 / 暗部的丝滑渐变 |
tremor + tremor_seed |
0.2–0.5,同种子同波形 | 生理颤动(手腕 λ≈90px + 震颤 λ≈28px,沿局部法向) |
points |
[[x,y,pressure,time_ms],…] |
给毫秒时间戳 ⇒ 引擎算真实速度(吃速度的笔刷才活) |
辅助:dwell(0..1,拐角多插点 ⇒ 颜料更足)、color / color_to(一笔内变色)。
作画流程(四遍,按顺序)
第一遍:大笔铺块面(这一步决定"不是填色")
size直接给大值,把全幅拆成 5–9 块:背景 / 暗部 / 中间调 / 亮部。- 每块 1–3 笔完成,笔触越过轮廓(后面再收)。
- 大块之间的过渡不要手拼:用
gradient_blend—— 它就是"手动拼 20 笔"的服务端替代,且逐笔调用同一条落笔实现(与手画观感一致)。 - 禁用:
bucket、fill_region起稿 ✗(填充只允许用于最后统一底色灰这一种用途)。
第二遍:压出体积
- 同色系大小笔交替,顺着形体方向走:盘发的旋、肩的弧、裙的垂。
- 暗部 / 皮肤用
glaze: true罩出来,而不是一次涂死。 - 开启
pressure_curve: "auto"+tremor(带种子),让每一笔自身有浓淡与微颤。
第三遍:锚点收细节
- 只在持久锚点用小笔:脸、手、蕾丝、薄纱边缘。
- ∴ 小笔总数压到最低 —— 这既让画面真实(大笔是主体),又压住对象数(少笔 ⇒ 折叠开销不涨)。
第四遍:自检("一笔一笔看"清单)
- 起收笔看得见(不是两端齐平)—— 若齐平 ⇒ 检查是否误关
humanize。 - 单笔内部有浓淡变化 —— 若没有 ⇒ 检查
pressure_curve是否还是flat。 - 大块面是罩出来的、能透出底色 —— 若一次涂死 ⇒ 用
glaze。 - 边缘软硬不一(不要一圈同样硬)。
- 全图找不到"填满"的边界 —— 若找得到 ⇒ 说明起稿用了填充或小笔平铺。
反模式(明写,别做)
- ✗ 用
bucket/fill_region起稿。 - ✗ 小笔先描边、再涂满。
- ✗ 单笔一个不透明度平铺大面积。
- ✗ 把
humanize: false与pressure_curve: "flat"当默认(那是"精确复现控制点"用的,不是画画用的)。 - ✗ 一上来就抠细节(脸画得很准、块面是平的 ⇒ 观感立刻假)。
细节见 references/anti-patterns.md。
笔法不能只有大小:柔 / 薄 / 堆 / 刀
症状:笔触只有"大小粗细"的变化 ⇒ 整幅像一层层平叠,
最后还能看见填色的边缘线 ✗,细节一模糊就偏 ✗。
根因:只用了 size 一个维度 ✗。油的画味来自同一张画里同时出现厚薄软硬 ✓。
五样笔法(本仓的真实实现)
| 笔法 | 用什么 | 关键参数 |
|---|---|---|
| 柔(揉开、消边线) | smudge 工具,或 classic-knife 笔刷 |
smudge = 1.0 ⇒ 把画布上已有的颜色拖开 |
| 薄涂(透底) | 任何笔画 | glaze: true ⇒ 单笔自动拆成多遍微偏移薄涂;glaze_passes 3 起,8 遍饱和 |
| 堆(厚) | add_filter |
impasto |
| 层间融合 | set_layer_blend |
— |
| 肌理 | texture_background / list_textures |
— |
| 擦(干笔) | 本仓没有这个参数 ✗ | 近似:scatter_strokes 低 opacity_range + 小 size_range |
★ 刀与揉有一个前提:必须先有底色
smudge(以及靠它工作的 classic-knife)是涂抹类——它抹开画布上已有的颜色。
∴ 空白画布上它什么都不出,那是正确行为,不是坏了 ✓。
∴ 所以顺序是有物理原因的,不是构图偏好:
- 先用大笔铺 5–9 块底色(第一遍,
size给大,越过轮廓); - 再用
smudge/classic-knife把上下两笔的接缝揉在一起 —— 这一步消掉"填色边缘线"和一层层叠加的痕; - 需要透底的地方用
glaze,需要厚的地方用impasto⇒ 一张画里厚薄都有; - 最后才在锚点收细节。
细节精度:模糊要有边界
脸 / 手 / 蕾丝不许被 smudge 扫到 ✗ —— 那是"一模糊就偏"的来源。smudge 只允许用在非锚点区(背景、衣料大面、暗部过渡)。