刚接手一个数字人项目时,导演看完表情后的第一句话往往是“头发换一个”。如果你只是从Bridge重新下载一个MetaHuman,那还算简单;但凡需要自定义发型,ue metahuman头发更换这件事就会牵出整套Groom链路。我见过太多人在这一步翻车:头发导进去乱飞、不跟头、穿模、拉远就秃,最后怀疑人生。
这篇不是复述官方文档,是我在多个项目里从Maya做到UE5,从XGen导出到Groom绑定再到物理调参的完整记录。主要内容覆盖:Metahuman头发体系的资产结构、三条不同路线的选型、外部头发导入绑定的完整流程、物理模拟调参、渲染质感提升,以及我在实践中踩过的高频坑。适合已经能用Bridge跑通MetaHuman基础管线、想进一步把默认发型换成自定义发型的美术或技术美术阅读。
1. 先搞清楚:Metahuman的头发不是“头盔”,而是一整套Groom链路
1.1 你要面对的其实是Groom,不是Mesh
大多数人第一次想换头发时,会习惯性打开角色网格体找“Hair”的Mesh。这个方法在普通角色上有用,但在Metahuman上会让你找不到北。因为Metahuman的头发资产是UE里的Groom(Hair Strands)系统,它不是一个渲染网格,而是基于引导线的曲线集合。
原理解释:Groom里存放的是数千到数万根引导线(Guides),每根引导线是一串带位置信息的点,渲染时GPU会根据引导线之间的插值和密度设置,在表面生成更密集的可见发丝(Strands)。这就像你画了几根轨道,系统在轨道之间铺出一片铁轨。所以“换头发”真正要换的是:曲线数据(Groom Asset)、绑定(GroomBindingAsset)、材质实例,以及每组曲线上的物理参数。
1.2 一套默认发型里藏了多少依赖
从Bridge下载的Metahuman工程里,发型并不是孤立的单个资产。以一个女性预设为例,按字母筛选Groom时你会看到一个长长的列表,通常包括眉毛(Eyebrow)、睫毛(Eyelash)、顶部头发(TopGroom)、下层头发(BelowGroom)等。每个Groom旁边还会有一个对应的Binding资产,Binding记录了它和哪个骨骼网格体(通常叫Mesh_HRM_Body)绑定、使用哪几根骨骼。
这些资产之间的引用关系:
- Groom Asset(曲线数据)
- GroomBindingAsset(骨骼绑定信息)
- Material Instance(头发材质)
- Skeletal Mesh上的Physics Asset(碰撞体)
- Skeletal Mesh的AnimBP(动画驱动,表情和头部运动)
我在项目里排查过很多次“头发乱飞”的问题,最后都指向同一个答案:只换了Groom资产、没有重新生成Binding。所以建议动手前先在Content Browser里把顶层头发资产的引用关系列出来,右键选择Reference Viewer看依赖,对照我刚才这串链路逐个检查,能省至少一晚上的调试时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 换头发前先做选型:三条路线对应完全不同的改法
2.1 路线A:换官方预设发型,最省事但风格受限
如果导演只是说“换个搭配”,不用自定义:回到MetaHuman Creator,在Hair分类里重新选发型,然后在Bridge里重新下载这个角色的最新版本,覆盖工程里的Mesh和Groom。这个方法会自动重建完整的绑定、LOD和物理配置,基本不会出问题。
但要留意:MetaHuman Creator里的发型库是官方设计的,它们和头部模型的贴合度、骨骼绑定都是验证过的,所以省心。坏处是当你需要特定风格的皮质短发、脏辫、或者高精度扫描发型时,这条路直接堵死。
2.2 路线B:外部DCC制作自定义Groom,最正宗也是本文重点
如果要真正自定义,主流工作流是:在Maya(XGen或Ornatrix)、Houdini或Blender里制作头发曲线,导出Alembic(.abc),再在UE里导入成Groom,绑定到Metahuman骨骼上。这条路能最大化保留Groom的物理和渲染优势,也是MetaHuman官方建议的扩展方式,因为Groom系统原生支持Alembic曲线。
2.3 路线C:拿现成资产直接替换,先分清楚是“Groom”还是“卡发”
很多商城资产或扫描模型提供的头发是卡发(Card Hair),也就是多边形面片上面有透明贴图,根本不是曲线。如果强行放到Metahuman头顶上,你面对的是无数张交叉的面片,没有物理可言,转动头部时容易出现穿插。
卡发能不能用?能。它更容易控制风格,消耗通常低于Groom,但你要自己解决绑定和碰撞问题。比如把卡发合并成一个网格体,然后附加或蒙皮到头骨骨骼上,再做衣服级别的碰撞。如果希望最终效果接近影视级,我建议还是走Groom。
2.4 选型表格与决策建议
| 维度 | 路线A 官方换预设 | 路线B DCC制作Groom | 路线C 现成卡发/网格体 |
|---|---|---|---|
| 自定义程度 | 低,仅限官方库 | 高,任意造型 | 中等,取决于资产 |
| 工程复杂度 | 最低 | 较高 | 中等 |
| 物理表现 | 官方调好 | 可完全控制 | 需自行处理 |
| 渲染上限 | 高 | 高 | 中等 |
| 适合场景 | 快速预览、多角色换装 | 电影CG、高保真项目 | 游戏化渲染、移动端 |
选型建议:我个人的习惯是,如果需求是“先做个Demo给导演看”,走路线A;如果最终要产出高质量的镜头,即使时间紧也要走路线B,因为路线C的卡发在特写镜头里几乎没办法解决穿插;只有明确目标是移动端或低配PC时,才优先考虑卡发。
3. 主流路线实操:把外部Groom头发绑定到Metahuman的完整流程
3.1 在DCC里把头发弄干净:导出Alembic前的几个硬性要求
不管用XGen还是Ornatrix,导出前都要确认几件事:
- 必须导出的是曲线,不是多边形。XGen里是创建描述并烘焙成Alembic;Ornatrix可以用Converter等输出曲线。
- 命名规范:分组名和物体名用英文,不要用中文或空格。比如“Guide_Front”、“Strand_Back”。因为UE在导入和引用时对特殊字符敏感,中文命名在部分版本会导致Groom导入后成空资产。
- 坐标与单位:建议在DCC里就摆成与Metahuman头部大致匹配的位置,然后以世界坐标导出。UE单位是厘米,Maya默认也是厘米,Houdini要注意你的场景单位是不是米,导出前统一成厘米,不然导入后头发会差100倍,直接掉到地板下面去。
- 宽度信息:Alembic里带Curve Width更好,这样导入UE后你还能在Groom的细节面板里看到预设的Root Width和Tip Width;如果没有宽度,UE默认用1厘米,看起来很粗,像钢筋。
如果你是从零开始制作头发,建议引导线数量至少几万条(比如15000-30000),实际发丝由UE插值生成。引导线太少会显得稀疏,太多会导入很慢并影响实时性能。
3.2 UE端导入Groom:不只是拖一个文件那么随便
- 确保Groom插件是启动状态(默认启用)。
- 直接把.abc拖进Content Browser,在弹出的导入面板里,关键参数是:
- 比例(Scale):通常保持1,但你从Houdini导出来时如果发现差100倍,可以在这里改0.01。
- 方向转换:Maya/Y up场景一般自动处理,Houdini如果不带旋转标签,可能需要阅读导入后的轴向,不对的话回DCC修。
- 帧范围:Groom只需要静态曲线,通常导入单帧就够了,不需要把整个动态毛发模拟也导进来。
- 导入完成后生成的是GroomAsset。双击打开,Viewport里应该能看到曲线预览。
一个我踩过的点:导出Alembic时如果选了“整个序列”而你的头发存在于多个时刻,UE会默认把每一帧都当成形态目标,Groom资产会变得极卡,而且绑定后可能出现头发抽搐。正常情况下只导出一帧或把时间范围设成单帧。
3.3 创建GroomBinding,把头发“焊”到骨骼上
在Groom Asset上右键,选择Create Binding Asset(有的版本菜单是“Create Groom Binding”)。对话框里:
- Skeletal Mesh选择Metahuman的Body模型(通常是Mesh_HRM_Body_LOD0)
- Geometry Type选择Simulation或Rigid,默认Simulation即可
- LOD数量:默认跟随骨骼网格体,Metahuman一般4级LOD
- Binding方式通常选RBF(径向基函数)或Linear。RBF对骨骼旋转插值更柔和,但计算更慢;Linear更快、更直接。头部骨骼相对简单,用Linear就够,出问题再切RBF。
生成Binding资产后,在Groom Asset的细节面板里把Binding指定给它。这里如果不指定,Groom就没有绑定信息,动画里摇头时头发会停在原地,这也是“头发起飞”最常见的原因。
3.4 到Metahuman蓝图里替换默认Groom
Metahuman的角色蓝图通常分成Body和Face两部分。替换头发的战场在Body蓝图,找到跟头发相关的Groom组件(一串以Groom开头的组件)。操作建议:
- 先把新Groom的Binding和材质指定好。
- 在组件列表里选中默认的TopGroom组件,复制一份你新Groom的配置,或者新增一个Groom组件并把Groom Asset设成你的新资产。
- 禁用或删除旧的TopGroom组件,避免两套头发叠在一起导致半透明失真。
- 如果Metahuman有多个LOD的Groom,检查LOD设置里是否都指向了新资产。有些项目会把同一份Groom在LOD0和LOD1中重复引用,你都替换掉。
我在实际项目里习惯先替换再测试,而不是先删除旧的。保持旧的Groom组件在关卡里被禁用而不是删除,这样万一新资产出问题,可以快速切回默认状态,方便导演对比。
3.5 材质匹配:别让新头发看起来像钢丝
导入的Groom默认材质往往是空白的,渲染出来会又黑又亮,像上过油的钢丝。正确做法是拿Metahuman自带的头发材质实例作为模板,右键复制一份,把Texture参数换成你自己头发的贴图,或者直接沿用官方贴图并调节颜色。
Metahuman头发材质基于Hair Strands Shading Model,核心参数有主色、粗糙度、散射、背面透光等。后面渲染细节章节会展开。
4. 物理调教:头发跟头、随风与碰撞的调参细节
4.1 先想明白,头发为什么会动
把头发绑定到骨骼后,它已经会跟着头动了,但这时的跟随很机械,像一顶帽子。要让头发像真的“飘”而不是“长”在头上,靠的是Groom的物理模拟。UE在GPU上对引导线做约束求解,然后通过材质和插值把运动传给可见发丝。
可以这样理解:每根引导线有“保持原形的力”(刚度)、“对抗速度的力”(阻尼)、“模拟外力”(重力、风、身体运动的惯性)和“防止穿透”(碰撞体)。四个力没调好,头发就会出现转圈乱飞、原地抽搐、或者像石头一样纹丝不动。
4.2 每个参数我都试过:物理参数速查表
在Groom Asset的细节面板里找到Hair Groups,每一组的作用:
| 参数 | 作用 | 我推荐的起始值 | 备注 |
|---|---|---|---|
| Stiffness | 刚度,控制形状保持程度 | 0.1-0.3 | 短发调高,长发调低 |
| GlobalStiffness | 全局弹簧强度 | 0.05-0.15 | 必要时才加,防止整体塌 |
| InterpolationStiffness | 引导线间刚度 | 0.2 | 影响发型稳定性 |
| Damping | 阻尼,抑制震荡 | 0.4-0.8 | 调大防止“疯甩” |
| VelocityScale | 随骨骼运动响应的比例 | 0.1-0.5 | 调大头发甩动幅度 |
| SolveIterations | 求解迭代次数 | 3-8 | 数值更大更稳但更卡 |
| Collide Against | 碰撞通道 | 勾选World Dynamic和Pawn | 根据场景配置 |
| VelocityFromPosition | 由位移计算速度 | 开 | 对动捕有用 |
这套是我在多个项目里的默认起点,实际数值要按你的发型和镜头语气调整。短发的Stiffness通常要更高,否则它会像章鱼触手一样跟着身体乱抖;马尾或长发Damping和VelocityScale要配合,不然在高动态镜头里会甩出屏幕。
4.3 解决“穿模”的关键:给头皮加看不见的碰撞体
头发穿头的本质是缺少碰撞响应。Metahuman自带Physics Asset里可能没有专门的头部碰撞球,或者你新增的头发资产没有参与碰撞。处理方案:
- 打开Mesh_HRM_Body的Physics Asset,在头部区域添加几个Sphere Shape,位置放在头皮内部,大小刚好能覆盖颅骨范围。
- 把你的新Groom在细节面板的Physics设置中,Collision Enabled勾上,并确保Collide Against里加入了与这些Sphere对应的通道。
- 如果不想改Physics Asset,可以创建一个碰撞对象组件(例如SphereComponent)附加到头骨骨骼,命名为“HairCollision”,同样能参与碰撞。
这些碰撞体的优先级很高。一定不要让头发和整个身体的碰撞通道全部开满,否则长头发会一部分在衣服里、一部分在外面,布娃娃一样乱成一团。
5. 渲染质感提升:从“塑料钢丝”到“能拍特写”的参数组合
5.1 Hair Shading Model到底怎么选参数
Metahuman的头发材质效果不是普通PBR,它的核心是Hair Strands Shading Model,参数名称可能随版本略有变化,我给你一套可直接抄的参数调整思路:
- Base Color(主色):用贴图或纯色,深色发色控制最有效的是贴图而不是颜色值,因为Groom的高光和散射会显著提亮。
- Roughness(粗糙度):头发高光通常要有一点紧,推荐0.2-0.4之间。太低会变成油腻假发,太高会失去高光。
- Scatter(散射):控制光线在发丝内部的散射量,调高后发丝边缘会有一层柔光,适合金发和浅色发。黑发要调低,否则像毛玻璃。
- Backlit(透光):背光时头发透光更明显,拍逆光镜头时开一点很出效果。
- Absorption(吸收):控制发色的“浓淡”,黑色发调高吸收,浅色发调低。
5.2 根部与发尖的颜色渐变
很多默认Groom会附带一张从黑色到发色的渐变贴图,因为现实里头发根部往往比发尖暗。花三分钟在Photoshop里做一张从深棕到浅灰的渐变贴图,替换掉Groom纹理,效果立刻上两个档次。我见过不少美术把全部精力放在建模上,结果头发因为缺少渐变显得像塑料。
5.3 阴影、排序和自阴影的坑
Groom发丝的阴影用普通阴影贴图容易出黑斑,推荐在Directional Light上开启Capsule Shadow(胶囊阴影),特别是角色特写时,能让头发根部和高光阴影柔和很多。
排序问题一般出现在与透明物体(比如纱裙、玻璃)同时出现的镜头里。当头发和透明材质交叠时,渲染顺序会乱。解决:在你的头发材质中把DrawPriority设成一个中间值(比如100~200),或者把头发的Opacity Mask改成更稳定的模式。
5.4 LOD和性能优化:别等导演拉远镜头才发现秃头
Metahuman的Groom在不同的LOD下会逐渐简化,默认情况下拉到一定距离头发可能直接消失。你可以在Groom Asset的细节面板中把LOD策略改成“Manual”并按距离设置简化比例;如果你的项目对角色特写有硬性要求,我建议在特写LOD上关闭Groom的自动化简,保留全精度。
另一个常见坑是物理模拟在LOD下降后默认关闭,导致远景头发突然变成一坨静态模型。对这种“远看静态、近看飘动”的需求,可以在LOD设置里单独调整物理采样。
6. 踩坑实录:换头发过程中我反复遇到的五个坎
6.1 头发不跟头,像飘在空中的水母
现象:角色摇头,头发原地不动,旋转视角时它又像世界空间物体一样固定。
根因:Groom没有绑定信息,或者Binding里的SkeletalMesh指错了目标(比如选了Face模型而不是Body模型)。
排查链路:
- 选中新Groom资产,看细节面板里的Binding引用是否为空。
- 如果为空,右键创建Binding Asset,SkeletalMesh选Mesh_HRM_Body。
- 如果已有Binding,点进去检查目标Skeletal Mesh的骨骼层级是否匹配。
- 最后在关卡里选择Metahuman蓝图,在细节面板中把Groom组件的Binding切换成新资产。
6.2 头发在LOD切换的瞬间变成“方便面”
现象:镜头拉远再拉近,头发从一堆乱线恢复,中间有明显跳变。
根因:Groom的LOD曲线做得太激进,低LOD下生成的发丝数量不足,引导线间插值密度又太低。
解决:在Groom细节面板中,找到LOD配置,将LOD0的密度设为1,LOD1设为0.5以内,LOD2、LOD3再进一步降到0.2。如果你的镜头里有快速推拉,干脆把LOD1以上的裁剪距离改为0,保持全精度。
6.3 模拟开启后头发原地抽搐
现象:角色静止时头发像在抖腿,前翻后翻。
根因:Stiffness太低而VelocityScale太高,或者模拟的迭代次数过低,导致约束没有收敛。
解决:先把VelocityScale降到0.1,Damping调到0.8,Stiffness调回0.2以上,再逐渐调高。如果还抖,检查是不是头发和身体的碰撞通道冲突造成来回弹。
6.4 导入的Alembic头发在UE里是一个“刺猬”
现象:头发从头部各个方向向外炸开,完全不受重力影响。
根因:导出的曲线用的是局部坐标,或者DCC里的曲线方向反了(曲线起点不在头皮侧),导致UE按根点位置重新排列时所有点都乱了。
解决:在DCC里确认曲线方向一致,起点在头皮位置,导出时选“世界空间”,并且在导出Alembic前把模型的变换(Freeze Transform)执行一遍。如果已经导入了,回DCC修正后重新导出覆盖即可。
6.5 材质不透明导致的环境遮挡问题
现象:新头发在Metahuman面部上投下一片巨大黑色阴影,整个人好像戴了头盔。
根因:Groom默认材质可能关闭了“Shadow Caster”相关的正确处理,导致靠近头皮的阴影输出过黑;也可能是透光参数Backlit过低。
解决:复制Metahuman官方头发材质实例,把阴影相关的参数(如Shadow Parameter)调回官方默认;然后调节Scatter和Backlit,让头皮区域有足够的光线散射。
6.6 附加推送:如何快速A/B对比
当我需要对比“原版发型vs新发型”时,不会反复改蓝图,而是给角色蓝图加一个整数变量(CurrentHairStyle),在事件图表里使用Switch来切换Groom组件的可见性和引用。这样在Sequencer里可以通过动画关键帧直接切换发型,导演现场就能看到A/B,效率高很多。做法不复杂:写一个函数,入参是HairID,函数里把对应的Groom组件的Visibility设为true,其余设为false。
最后分享一点我的个人习惯:换头发这件事永远不要在同一个关卡里反复试错,最好新建一个测试关卡(HairTest),放一个静态灯光和一个转盘相机,每换一次发型就在这个关卡里看三分钟:正脸、侧脸、背光、转圈、摇头。把头发参数记录成一张Excel表,标注清楚每个发型在Stiffness、Damping、VelocityScale、Backlit参数上的差异。大项目里导演喜欢同时比对五个发型,没有这张表,你调试半个月后根本记不住哪个参数对应哪个效果。Groom系统功能很强,但它的调试成本也高,提前建立一套可重复的验证流程比临时抱佛脚管用得多。
