mcpField
B
blender-hair-grooming

blender-hair-grooming

github.com/el4cteo创意与媒体1.1k262 次安装1 天前更新
代码仓库

关于 blender-hair-grooming

面向美术人员的 Blender 毛发梳理技能,可制作发丝造型、毛皮和适用于游戏的卡片毛发。基于修改器的流程保留可编辑控制项,并报告曲线数量、长度和根部贴合间隙。

主要功能

  1. 01生成引导曲线与插值毛发
  2. 02叠加聚束、卷曲、下垂和噪声修改器
  3. 03创建游戏用卡片毛发和纹理图集
  4. 04将求值后的曲线导出为 Alembic 或 USD

适用场景

  1. 01使用顶点组遮罩梳理头发
  2. 02制作胡须或身体毛皮
  3. 03为游戏资产制作毛发卡片图集
  4. 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

专业梳理方法

  1. 先处理表面:头皮是一个网格(或头部本身),带有 UV(头发根据 UV 附着)和一个标记头发生长区域的顶点组。该组会成为密度遮罩,因此柔和的边缘能形成自然的发际线。
  2. 引导曲线 → 子曲线:几百到几千条引导曲线负责塑造形状,数千条插值生成的子曲线则提供体积。只调整引导曲线,不要调整子曲线。
  3. 分层塑形:先调整长度,再调整发束(发丝聚成发束),然后是卷曲/波浪,再加毛躁/噪波,最后调整轮廓(发梢变细)。将每项设为独立修饰器,方便开关。
  4. 手动梳理英雄级发型:使用曲线雕刻模式的笔刷(Comb、Add、Puff、Pinch、Grow/Shrink、Smooth、Slide、Density、Delete、Pull Tips)。程序化下垂能提供可信的基础效果,但不能塑造出完整发型。
  5. 在最终灯光下进行外观开发。头发的视觉效果主要来自高光和深度(发束能捕捉高光),而不是反照率。

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-width m,发梢收窄至 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