关于 blender-hair-grooming
面向美术人员的 Blender 毛发梳理技能,可制作发丝造型、毛皮和适用于游戏的卡片毛发。基于修改器的流程保留可编辑控制项,并报告曲线数量、长度和根部贴合间隙。
主要功能
- 01生成引导曲线与插值毛发
- 02叠加聚束、卷曲、下垂和噪声修改器
- 03创建游戏用卡片毛发和纹理图集
- 04将求值后的曲线导出为 Alembic 或 USD
适用场景
- 01使用顶点组遮罩梳理头发
- 02制作胡须或身体毛皮
- 03为游戏资产制作毛发卡片图集
- 04为 UE Groom 或 Houdini 导出发丝
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ el4cteo/ blender-skills --skill blender-hair-grooming安装后在 Claude Code 中输入/blender-hair-grooming确认已加载。
附带文件scripts/_bpyx.pyscripts/groom.py
详细介绍
发型梳理
执行模型在 blender-core 中。头发物理细节见 blender-simulation,外观开发见 blender-lighting-lookdev。
每项各调用一次
scripts/groom.py -- --surface Head --mask Scalp --length 0.15 --children 150000 --clump 0.5
scripts/groom.py -- --surface Head --mask Beard --length 0.02 --droop 0.2 --curl 0.004 --melanin 0.9 --name Beard
scripts/groom.py -- --surface Body --length 0.025 --droop 0.3 --clump 0.3 --name Fur
scripts/groom.py -- --cards Hair --card-count 150 --atlas-res 2048 --out //textures # game hair cards
专业梳理方法
- 先处理表面:头皮是一个网格(或头部本身),带有 UV(头发根据 UV 附着)和一个标记头发生长区域的顶点组。该组会成为密度遮罩,因此柔和的边缘能形成自然的发际线。
- 引导曲线 → 子曲线:几百到几千条引导曲线负责塑造形状,数千条插值生成的子曲线则提供体积。只调整引导曲线,不要调整子曲线。
- 分层塑形:先调整长度,再调整发束(发丝聚成发束),然后是卷曲/波浪,再加毛躁/噪波,最后调整轮廓(发梢变细)。将每项设为独立修饰器,方便开关。
- 手动梳理英雄级发型:使用曲线雕刻模式的笔刷(
Comb、Add、Puff、Pinch、Grow/Shrink、Smooth、Slide、Density、Delete、Pull Tips)。程序化下垂能提供可信的基础效果,但不能塑造出完整发型。 - 在最终灯光下进行外观开发。头发的视觉效果主要来自高光和深度(发束能捕捉高光),而不是反照率。
groom.py
- 运行 5.2 的 Add Empty Hair(
object.curves_empty_hair_add)。它会将头发设为表面的子对象,设置surface/surface_uv_map,向表面添加 Capture Rest Geometry,并添加节点 Hair Dynamics 修饰器(固定在最后,实验性功能)。随后按顺序堆叠内置资产:Generate(--density条/m² 的引导曲线)→ Interpolate(--children条/m²,--viewport为视口中的比例)→ Clump → Curl → Displace + Shrinkwrap(下垂量为--droop× 长度,保持在表面上方 2 mm)→ Noise → Set Hair Curve Profile(--radius,发梢渐细)。 - 发束/卷曲引导曲线距离 =
--length的 10%。 资产默认值为 0.1 m,会让整个头部的头发塌缩成几簇。 - 每项资产都会保留为具有实时输入的修饰器,方便调整。按名称获取输入:
getattr(md.properties.inputs, identifier).value;顶点组遮罩使用.type = "ATTRIBUTE"、.attribute_name。 - 它会报告曲线数量、平均长度、根部到表面的最大间距(必须约为 0)以及修饰器堆栈。后台模式下的评估数量使用视口数量。
数值
| 数值 | |
|---|---|
| 人类头皮 | ~100–150k 根头发,~200/cm²。CG:渲染 30k–150k 根发丝,300–3000 条引导曲线 |
| 发丝半径 | 实际为 0.03–0.05 mm。使用 0.05 mm(--radius 0.00005);发丝较少时可加粗 |
| 黑色素(Principled Hair,Chiang) | 黑色 1.0 · 深棕色 0.8 · 棕色 0.65 · 浅棕色 0.45 · 金色 0.25 · 铂金色 0.1。红色:0.5 + 红度 0.9。灰色:0 + 色调 |
| 粗糙度 | 0.25–0.35(有光泽)… 0.5(干燥)。径向粗糙度为 0.3 |
| 毛皮 | 长度 1–5 cm,密度 200k–2M/m²,少量发束 |
HUANG(4.0+)会对椭圆截面建模,更适合特写镜头。CHIANG 是参考默认值。 |
游戏用发片(--cards HAIR)
- 从经过评估的梳理结果中挑选分布均匀的
--card-count条发丝(最远点采样),并沿每条发丝生成一条带状面片:宽度为--card-widthm,发梢收窄至 30%,平贴表面(侧向 = 切线 × 表面法线)。UV 的 v 坐标从发根 0 → 发梢 1,每张发片对应一个图集列(--atlas-columns)。 - 使用 Cycles 从扁平的发束渲染图集:
T_<name>_BC(发根较暗,Alpha 通道表示覆盖率,Standard 视图变换),以及T_<name>_RootTip和T_<name>_ID(Raw,线性数据)。发片材质使用 Dithered Alpha,不启用背面剔除。 - 专业制作会从头皮向外分层放置发片:头皮上使用密集、宽大、不透明的发片遮住皮肤;中间层使用中等发片;最上层使用细小的飞散发片。面数预算:英雄角色 20k–60k 三角面,NPC 5k–15k。将发片弯成 S/C 形,绝不要使用平面,并从各个角度检查。游戏引擎使用 Alpha Test/Dither + 深度预通道;使用 RootTip 贴图进行变暗/AO,使用 ID 贴图实现逐发丝变化。沿 V 方向添加切线(流向)贴图,以实现各向异性高光。
导出梳理后的毛发
为 UE Groom/Houdini 梳理毛发:使用 Alembic(wm.alembic_export)或 USD(wm.usd_export(export_curves=True))。两者都会写入求值后的曲线(实测:246/246 条曲线往返一致)。如果目标只需要引导毛发,请先应用修改器堆栈。
注意事项
- 表面没有 UV 时,
Generate无法附着。请先添加 UV,再梳理毛发。 - 梳理毛发后更改表面拓扑会导致附着失效。请最后再梳理,或重新运行。
- 缩放:应用头部的缩放。长度和密度以世界空间米为单位。
- 视口:处理完整头部时,将
--viewport保持在 ≤ 0.2。最终毛发数量只会在渲染结果中显示。 - Hair Dynamics 会在播放时进行模拟。对于第 1 帧的静帧,它会直接传递。请先烘焙(
blender-simulation),再渲染动画。
评论
支持 Markdown