← 返回 PaperDaily 视觉与图像

马普所PhysHead:给数字人装上“仿真头发”,风吹发丝不再僵硬

现在的数字人头像,脸可以以假乱真,头发却像顶了个头盔——怎么晃都是死的。马普所等机构提出PhysHead,把头发拆成一根根发丝并接入物理引擎,让头像在点头、转头甚至刮风时,头发真的会飘。顺便还借大模型把“秃头版”训练数据造了出来,细节拉满。

马普所PhysHead:给数字人装上“仿真头发”,风吹发丝不再僵硬
原论文信息如下:
论文标题:
PhysHead: Simulation-Ready Gaussian Head Avatars
发表日期: 2026年4月
发表单位: 马克斯·普朗克智能系统研究所、苏黎世联邦理工学院、图宾根大学、达姆施塔特工业大学等
原文链接: https://arxiv.org/abs/2604.06467
项目链接: https://phys-head.github.io

先来看一张让人有点恍惚的图。上面这张来自论文的效果图,展示的是同一位演员在四种不同状态下被重建出的三维头像:左侧是原始多视角视频重建出的“完整版”,中间是剥离头发后的“秃头版”,右侧是在物理引擎驱动下发丝自然摆动的“动态版”。如果不提前说明,很多人会以为这是哪部电影里的CG角色。

但熟悉数字人的人一眼就能看出门道:问题就出在头发上。

从静态到动态:数字人头发的物理仿真革命

PhysHead整体效果图

图1 PhysHead:从多视角视频重建具有动态头发的逼真头头像,头发为发丝级表示且可直接物理仿真。

先抛一个问题:为什么电影里的CG角色头发能一根根飘起来,而现实中的数字人头像,头发却总像一顶焊死在头上的头盔?

答案藏在技术路线里。电影工业用的是发丝级(strand-based)物理仿真——把头发表示成成千上万根独立的曲线,然后丢进物理引擎里,让重力、风力、碰撞这些真实世界的力去驱动它们。动画师再微调每一根发丝的刚度、阻尼和摩擦系数,直到风吹过来时,头发的摆动看起来和真人一样自然。
但数据驱动头像重建的主流方法,走的是另一条路。以NeRF和3D高斯泼溅(3D Gaussian Splatting,3DGS)为代表的方案,直接把头发当成头像整体的一部分去拟合。它们确实能重建出极其逼真的静态外观,却几乎没有"头发是会动的"这个概念。头像转头,头发跟着转;头像点头,头发纹丝不动;想模拟一阵风,抱歉,没有这个功能。论文里管这种现象叫刚性头发
有人可能会说:那我专门采集头发运动的视频数据,用数据驱动的方法学会"头发怎么动"不就行了?比如针对某位演员,采集几百段不同方向的风吹头发的视频,训练一个头发运动预测模型。
这个思路理论上可行,但论文直接点出了它的死穴:你永远无法采集所有的物理场景。换个风向,数据要重采;换个发型,数据要重采;换个头加速度曲线,数据还是要重采。现实中的头发运动由风源方向、风速分布、发质软硬、头部运动轨迹等无数变量共同决定,想靠有限的数据覆盖无限的物理可能性,根本不可能。
PhysHead的做法是"返璞归真":与其费尽心思从数据里学物理,不如直接把物理引擎搬进来。头发用发丝表示,然后让Blender的物理引擎去解算每一帧的运动。头部姿态和表情由一个参数化三维形变模型(3D Morphable Model,3DMM)驱动,头发运动则完全交给物理规律。这两个系统被统一到一个基于3D高斯的外观渲染框架里——面部用附着在网格上的高斯图元表示,头发用附着在发丝段上的高斯图元表示。这样一来,"表情控制"和"头发仿真"两件事就被彻底解耦了。
物理仿真演示:头发在风力作用下的动态效果
上图就是PhysHead在风力作用下的头发动态。注意看发丝从发根到发梢的"波浪式"响应——这不是整体摆动,而是由近及远逐渐传递的物理运动。这种自然感正是数据驱动方法很难模仿的。

分层表示:面部与头发的完美解耦

想要做到"表情归3DMM管、头发归物理引擎管",第一步必须把头像从"一整块"拆成"两层":一层是面部,一层是头发。这个操作在论文里叫分层解耦(layered disentanglement)
为什么非拆不可?论文给了一个非常直观的失败案例:如果只用单一层3D高斯同时建模脸和头发,优化时模型没有约束去区分"这是皮肤"和"这是头发",结果动画驱动时,面部和头发区域粘在一起,出现"皮肤被撕下来"的伪影。论文里管这种伪影叫皮肤剥落(skin peeling)
PhysHead采用两阶段优化策略来避免这个问题。第一阶段只优化面部层。面部由一个参数化头部模型FLAME驱动,该模型描述了人脸形状、表情和姿态的统计规律。3D高斯图元被绑定在FLAME网格的三角形上,而不像普通3DGS那样优化全局坐标。每个高斯图元的参数可以表示为如下公式:
3D高斯参数定义公式
其中μ是位置,s是缩放,q是旋转四元数,o是不透明度,c是基础颜色,SH是球谐系数(Spherical Harmonics coefficients),用于模拟视角相关的颜色变化。这些参数不直接优化全局坐标,而是绑定在FLAME网格三角形上,随FLAME参数的变化而运动,因此可以通过修改FLAME参数来控制表情和姿态。
第二阶段优化头发层。头发用发丝集合表示,论文先用NeuralHaircut(一种从多视角图片重建发丝几何的方法)获取初始发丝,再做均匀重采样,得到约6万根发丝、每根16个采样点。每一根发丝段上挂一个拉长的3D高斯,并用Frenet-Serret框架(TNB框架,由切线T、法线N、副法线B三个正交向量构成)来确定每个高斯的旋转方向。发丝高斯的均值与尺度由公式给出:
发丝高斯均值与尺度公式
其中p₁、p₂是发丝段两端的三维坐标,k是一个极小的常数(论文取0.0001),保证高斯在垂直于发丝方向上是"细长"的。
图2:PhysHead方法概览。PhysHead从多视角输入视频重建可动画3D人头化身,基于3D高斯外观表示,分为面部和头发区域。
图2:PhysHead方法概览。重建的3D头像分为面部区域和头发区域:面部由附着在FLAME网格上的3D高斯表示,允许参数化表情和头部位姿控制;头发由发丝模型和附着在每段发丝上的结构化3D高斯表示。
这里还要强调一个分层带来的额外好处——它天然支持"换发型"操作。由于头发是独立的一层,用户可以把A的头发的发丝几何"嫁接"到B的头像上,不需要重新训练任何网络。这个特性在后面的应用演示中会看到。

VLM助力:解决遮挡区域的秃头图像生成

现在的问题来了:训练面部层时,输入图像里带着头发,怎么办?
直接拿带发图像训练也不是不行,但后患无穷。长发演员的耳朵、发际线、头皮在大部分视角里都被头发盖住,这些区域的高斯参数在训练中从未被监督过。动画时一旦视角变化,露出来的皮肤就是一块没有纹理的"空洞",或者更糟——和头发糊成一团。
PhysHead的对策很直接:先想办法把训练序列里的头发"P掉",生成一套"秃头版"训练视频。但"P头发"这件事听起来简单,做起来极难——普通图像编辑工具一次只能处理一张图,多视角一致性完全没有保障。举例来说,同一颗耳朵,从正面视角看是长这样,从侧面视角看,模型可能给你生成一个完全不同的耳朵。
论文给出的方案是一个"VLM+可微渲染+泊松编辑"的组合管线。首先,用Nano-Banana这个视觉语言模型(Vision Language Model,VLM)把多视角序列中第一帧的头发移除,得到若干张"秃头参考图"。VLM生成的结果不是每张都靠谱——有些图连头部姿态都被模型改了——所以论文做了一个多视角一致性筛选,把不合格的样本丢掉。
接下来,基于这些筛选后的稀疏视角,通过可微渲染优化一张FLAME模型的共享纹理贴图T。这张纹理贴图可以被理解为"头部外观代理"(appearance proxy)——它以显式的UV纹理形式,把耳朵、发际线、头皮这些被遮挡区域的外观信息"烘焙"了下来。
图3:使用VLM编辑移除多视角输入序列第一帧的头发,构建基于FLAME头部模型可微渲染的外观代理,再通过泊松图像编辑移除整个动态序列中的头发。
图3:VLM生成秃头训练图像流程。从左到右:原始多视角图像 → VLM去掉第一帧头发 → 优化共享纹理外观代理 → 通过泊松图像编辑生成整套"秃头"训练序列。
有了这张外观代理纹理,就能处理整个动态序列了。对每一帧,先用FLAME网格按该帧的头部姿态和表情渲染出外观代理,然后用泊松图像编辑(Poisson image editing)把代理纹理无缝地"融合"进原始图像的皮肤区域。泊松编辑的优势在于它会在融合边界上做梯度域插值,不会出现明显的接缝或颜色断层,同时保留了原图中可见皮肤部分的真实细节,比如毛孔、雀斑、皱纹和光影。
生成秃头图像对比:左侧为捕获图像,右侧为生成的秃头图像
上图左侧是原始采集图像,右侧是利用外观代理和泊松编辑生成的"秃头版"图像。可以看到,耳朵、发际线、头皮这些关键区域都被合理地补全了。
这个方案和同期工作HairCUP形成了鲜明对比。HairCUP用分数蒸馏采样(Score Distillation Sampling,SDS)从预训练扩散模型中"蒸馏"秃头图像,但SDS生成的图像在耳朵等区域容易产生伪影,而且对不同肤色的人容易生成"模板脸"。PhysHead用VLM+纹理代理+泊松编辑的组合,无论是清晰度、肤色保真度还是对不同人种的泛化能力,都明显更胜一筹。

发丝级颜色一致性:让隐藏区域也自然

面部层解决了,头发层的"坑"又来了。
多视角采集系统一般只有16~32个摄像头,覆盖的都是正面和侧面视角。头顶、后脑勺、头发内侧这些区域,在所有视角里几乎都看不到。如果这些隐藏发丝的颜色是随机初始化的,物理仿真一启动,头一甩,几缕颜色诡异的"杂毛"就会转到镜头前,动画效果瞬间翻车。
PhysHead的解决方案是一个发丝级别的颜色一致性正则化。核心思想很朴素:几何上相邻的发丝,颜色也应该是相似的。对于每一根发丝i,在它的空间邻域内找到k根最近邻发丝,让它们的颜色尽量接近。由此定义的颜色一致性损失为:
发丝颜色一致性损失公式
其中cᵢ是第i根发丝的颜色向量,N(i)是空间上的近邻发丝集合。这个损失鼓励可见发丝的颜色像"染料"一样,沿着发丝间的空间邻接关系扩散到不可见的隐藏发丝上。
一个容易忽略的细节是,这个约束不是从头到尾都开启的。论文在前5000次迭代中只使用图像重建损失优化可见发丝,让它们先学到正确的颜色,然后再开启颜色一致性约束,让颜色自然地向隐藏区域传播。如果一开始就开启约束,可见发丝还没学好,反而会把错误颜色传染给所有发丝。
头发区域的外观优化还设计了一个细节:计算渲染损失时,只计算头发掩码M_hair覆盖的区域,避免发梢附近把皮肤颜色误染到头发上。形式化地,头发区域的RGB损失为:
头发RGB损失公式
其中I_rend是渲染图像,I_gt是真实图像,⊙表示逐元素相乘,M_hair是二值头发掩码。可以看出,损失只约束头发区域内的像素。
图8:颜色一致性损失帮助隐层3D高斯图元获得有意义的颜色。
图8展示了颜色一致性损失的直观效果:加上约束后,隐藏发丝也获得了和可见发丝一致的颜色过渡,整个发丝层看起来是"一个整体"。

物理仿真驱动:从稀疏引导到密集发丝的运动传递

现在终于到了PhysHead最"硬核"的部分——物理仿真。
一个直接的想法是:把6万根密集发丝全部丢进物理引擎里模拟受力。但这样做的计算量巨大,在消费级硬件上根本跑不动。PhysHead的做法和电影工业一样精打细算:只对一小部分稀疏引导发丝做物理仿真,再把运动"转移"给全部密集发丝。
物理引擎部分,论文采用了Blender内置的物理引擎,对头发粒子系统做刚体动力学积分。运动规律遵循牛顿第二定律:
牛顿第二定律微分形式
其中v是粒子速度,m是质量,F是粒子受到的合外力(包括重力、风力、惯性力、碰撞力等),x是粒子位置。离散化后采用半隐式欧拉积分进行时间步进:
速度离散更新公式 位置离散更新公式
半隐式欧拉的关键在于先用新速度更新位置,比显式欧拉更稳定。另外,Blender的物理引擎还会运行一个迭代约束求解器来处理碰撞和接触约束,保证发丝不会穿入头部网格。
稀疏引导发丝的运动算完后,剩下的问题是:如何让它驱动6万根密集发丝?
论文采用了一种叫发丝蒙皮(strand-skinning)的加权传递方案。对每一根密集发丝,在稀疏引导发丝中找到k个最近邻,权重与距离成反比——离得越近,影响越大。关键点在于,传递的不是引导发丝的绝对位置,而是相对位移:
图4:发丝蒙皮示意。密集发丝受k=10根稀疏发丝的影响,蒙皮权重与距离成反比。
图4:发丝蒙皮示意。密集发丝(黑色)受最近的k=10根稀疏发丝(彩色)影响,权重与距离成反比,d₁越小则ω₁越大。
具体来说,密集发丝在每帧的新位置 = 上一帧位置 + 引导发丝的加权位移增量。这样既保证了密集发丝跟随引导发丝运动,又保持了自身初始几何的细节。整个流程可表示为:密集发丝新位置D_t(i) = D_{t-1}(i) + ΔS_t(i),其中ΔS_t(i)是引导发丝位移的加权和。
动态效果视频:头部化身在表情和姿态变化下的头发动态
这个GIF展示了PhysHead在表情变化和头部姿态变化下的头发动态。注意头发在头部动作的带动下自发地产生"滞后"和"回摆",这种效果在刚性头发方法中是不可能出现的。

突破与局限:PhysHead的边界与未来

评价一个方法好不好,最好的方式是直接放进对比实验里"遛一遛"。PhysHead主要对比了四类方法:Gaussian Avatars(GA)、Gaussian Head Avatars(GHA)、GaussianHaircut(GH)和同期工作HairCUP。
GA和GHA的问题非常一致——刚性头发。从图5可以看出,当驱动信号是大幅度的转头、点头动作时,GA和GHA的头发几乎没有任何变形,与PhysHead的头发动态形成鲜明对比。
图5:定性对比。所有方法都能合成逼真头像,但GHA和GA在动画时头发是刚性的,而PhysHead利用发丝表示推广到新驱动信号。
图5:三种方法在驱动信号下的对比。t=0时刻基线方法效果尚可,但在大幅运动序列中,GA和GHA的头发保持刚性,PhysHead则能产生自然的头发动态。
论文还做了一个有趣的量化分析:在点头序列中,计算头发区域3D点的标准差。PhysHead的标准差显著高于基线方法,说明发丝确实在运动;而对比方法的标准差几乎为零,直接证明了"刚性"问题。
GaussianHaircut是发丝级别重建的代表方法,但它主要面向静态重建,没有考虑"动画"场景。论文实验发现,GaussianHaircut重建出的发丝有部分穿透进头部区域,并且这些发丝会学到皮肤的颜色——直接拿去做物理仿真,会出现"头皮里长头发"的尴尬景象。反观PhysHead,由于有分层优化和颜色一致性约束,发丝全部位于合理位置且颜色干净。
与GaussianHaircut的对比展示
图6:与GaussianHaircut的对比。GaussianHaircut有发丝穿入头部并学到皮肤颜色的问题,PhysHead的发丝颜色更一致,可直接用于物理仿真。
表1:与GaussianHaircut的定量对比。绿色为最佳,黄色为第二。
表1:与GaussianHaircut(GH)的定量对比。PhysHead的PSNR为30.28,略低于GH的30.55,但SSIM(0.946 vs 0.915)和LPIPS(0.061 vs 0.071)更优。这说明PhysHead的静态渲染质量与GH相当,但感知质量更好。
这里需要诚实指出:PhysHead的PSNR并没有超越GaussianHaircut,优势主要体现在SSIM和LPIPS这两个感知指标上。PhysHead的核心竞争力不在静态渲染指标上,而在"物理仿真就绪"这个GH根本做不到的能力上。对于只看重静态外观的应用场景,PhysHead的复杂度不一定划算;但如果你需要可交互、可物理模拟的数字人,那就是完全不同的赛道了。
HairCUP虽然同样做到了头-发分层,但它的秃头模型基于SDS训练,在耳朵等被遮挡区域容易产生伪影,而且它的头发也是无结构高斯,无法进物理引擎。PhysHead的VLM+纹理代理方案,在遮挡区域重建质量和肤色多样性上都表现得更好。
图7:与HairCUP的对比。HairCUP的SDS方案在遮挡区域有伪影,PhysHead的VLM方案泛化更好。
图7:与HairCUP的对比。HairCUP的SDS方案在秃头图像上存在伪影,且倾向生成同质化肤色;PhysHead的VLM方案对不同肤色泛化更好。
此外,由于头发层的发丝是显式几何,PhysHead天然支持多种编辑操作:比如直接编辑发丝的几何形状(把直发改成卷发),或者编辑发丝颜色(把黑发改成金发),甚至可以在不同人之间"换发型",而不需要重新训练模型。
头发几何编辑示例 头发外观编辑示例
图9:发丝层支持用户编辑几何和颜色,实现发型和发色自由调整。图10:分层头像表示支持换发型等编辑操作。
当然,PhysHead也有明显的边界和局限。论文自己承认了两点:一是最终效果依赖前景掩码和头发掩码的质量,掩码不准,分层的边界就会糊掉;二是发丝几何直接继承自NeuralHaircut,而NeuralHaircut对卷发这类复杂发型的重建效果有限——从论文的补充实验看,卷发结果的整体形状和纹路保持得不够好,发丝的细节有丢失。此外,整个流程涉及3D高斯优化、VLM编辑、物理仿真多个环节,中间有不少超参数需要调节,复现门槛不低。
图16:卷发结果。PhysHead在卷发上的效果受NeuralHaircut几何重建质量的限制。
图16:卷发结果。可以看出,PhysHead在卷发上的重建效果不完美,这是由于底层发丝几何重建方法本身对卷发的表示能力有限。
未来值得探索的方向也很明确:一是把发丝几何重建做得更鲁棒,摆脱对NeuralHaircut的依赖;二是和语音驱动、表情驱动结合,做成完整的"视频进、动态化身出"的实时管线;三是探索让物理仿真参数(刚度、阻尼、质量等)从真实数据中自动学习,而不是靠人工调节。

融会贯通

结合PaperDaily已收录的论文来看,头部化身这个赛道正处在从"静态逼真"到"动态逼真"的爬坡期。此前的主流方法重点解决"脸怎么渲染得更真实",头发普遍是"能看就行"。
PhysHead把头发从"外观问题"重新定义为"物理问题",看似只是换了表示方式,实际上把技术栈的开放程度提升了一个量级——发丝级表示天然支持编辑、替换、仿真,而这些操作在隐式表示或网格表示里都做不了。
从PaperDaily已收录的同基准对比数据看,PhysHead在Ava-256数据集上的量化指标并未全面超过此前的方法——PSNR甚至略低于GaussianHaircut。它的核心优势集中在动态场景和物理一致性上,而这类优势恰恰是传统图像质量指标难以捕捉的。因此,站在"静态渲染精度"的角度评价PhysHead,它并不算碾压级;但站在"数字人产业落地"的角度,物理仿真带来的动态真实感是目前其他方法完全无法提供的。
另外一个值得注意的细节:Ava-256数据集只有16个视角、8个表情,数据量算不上大。PhysHead依然能学会发丝级的动态效果,说明分层表示带来的归纳偏置起了很大作用。对于一些"数据不够"的团队,这个思路本身就有很强的借鉴意义——与其盲目堆数据,不如先把先验结构设计明白。

龙迷三问

下面是龙哥对于大家可能的一些问题的解答:
这篇论文到底在解决什么问题?PhysHead提出一种可物理仿真的三维高斯头头像重建方法:面部由FLAME参数模型驱动,头发用发丝级高斯表示,可直接接入物理引擎生成风吹等自然动态;并借助视觉语言模型补全被头发遮挡区域。用户研究显示,物理合理性获98.5%认可。
这篇工作最值得看的点是什么?在头发动态效果上显著优于基线方法,静态外观与GaussianHaircut相当,但头发模拟能力大幅提升;用户研究显示98.5%的参与者认为物理合理性优于基线。
这篇工作的边界或风险在哪里?优点:1) 首次实现物理驱动的动态头发与3D高斯头戴化身结合;2) 分层表示实现面部与头发的完全解耦;3) 利用VLM生成秃头训练图像解决遮挡问题;4) 发丝级颜色一致性正则化保证未见区域外观合理。缺点:1) 依赖NeuralHaircut的头发几何重建质量;2) 对前景和头发掩码质量敏感;3) 无法处理卷发等复杂发型。
如果你还有哪些想要了解的,欢迎在评论区留言或者讨论~

龙哥点评

论文创新性分数:★★★★☆

提出一种分层高斯头戴化身表示方法,将头部与头发解耦,利用基于物理引擎的引导发丝模拟实现动态头发效果,并通过VLM生成秃头训练图像以处理遮挡区域。

实验合理度:★★★★☆

PSNR、SSIM、LPIPS、用户研究(物理合理性、结构一致性)、PCA解释方差、时间平滑度

学术研究价值:★★★★☆

提出一种分层高斯头戴化身表示方法,将头部与头发解耦,利用基于物理引擎的引导发丝模拟实现动态头发效果,并通过VLM生成秃头训练图像以处理遮挡区域;更关键的是问题定义是否可复用到同类任务。

稳定性:★★★☆☆

现有材料未提供充分的极端条件、重复运行或扰动测试,稳定性暂按中性评价。

适应性以及泛化能力:★★★☆☆

现有材料未完整展示跨数据集、跨场景或分布外实验,泛化能力仍需进一步验证。

硬件需求及成本:★★★☆☆

头发模拟约1秒/帧(MacBook Air M3),渲染约0.0033秒/帧

复现难度:★★★☆☆

https://phys-head.github.io

产品化成熟度:★★★☆☆

论文验证以研究实验为主,真实部署中的时延、成本、维护和异常场景仍需补充验证。

可能的问题:;4) 发丝级颜色一致性正则化保证未见区域外观合理。缺点:1) 依赖NeuralHaircut的头发几何重建质量;2) 对前景和头发掩码质量敏感;3) 无法处理卷发等复杂发型。


*本文仅代表个人理解及观点,不构成任何论文审核或者项目落地推荐意见,具体以相关组织评审结果为准。欢迎就论文内容交流探讨,理性发言哦~ 想了解更多原文细节的小伙伴,可以点击"阅读原文",查看更多原论文细节哦!       

转发文章 微博 X LinkedIn Facebook
龙哥读论文 · PaperDaily

本文基于龙哥读论文 PaperDaily 数据库整理,结合论文原文与工程视角进行解读。

LONGGE AI COMMUNITY

把每天读到的论文,变成长期积累

加入「龙哥读论文」知识星球,持续获取 AI 论文、资讯、开源项目、招聘与研究思路。

加入龙哥读论文微信群:添加微信 kangjinlonghelper,备注“研究方向 + 地点 + 学校/公司 + 昵称”。

龙哥读论文知识星球二维码 微信扫码加入知识星球