BlendShape 混合变形
什么是 BlendShape
BlendShape(混合变形,也称 Morph Target 变形目标)是一种基于顶点插值的动画技术。它通过在多个预先雕刻好的目标形状之间进行线性插值,实时改变网格的顶点位置,从而产生平滑的形变效果。BlendShape 特别适合表现面部表情、口型同步等细微的局部变形,与骨骼动画互补。
工作原理
BlendShape 需要一组基础形状(Base Shape)和多个目标形状(Target Shapes)。每个目标形状定义了相对于基础形状的顶点偏移量。最终顶点位置通过以下公式计算:
`V_final = V_base + Σ (wi * ΔVi)`
其中,ΔVi 是第 i 个目标形状的顶点偏移,wi 是该目标的混合权重。权重通常在 0 到 1 之间,但也可以超出此范围以获得夸张效果。所有目标共享相同的拓扑结构(顶点数和三角形连接关系)。
与骨骼动画的区别
- **骨骼动画**:通过层级骨骼变换间接驱动顶点,适合肢体等大幅度的刚体运动。
- **BlendShape**:直接操作顶点位置,适合精细的表面变形,如面部肌肉运动、皱纹等。
两者常结合使用:骨骼动画控制头部转动和身体动作,BlendShape 控制面部表情。
应用场景
面部动画
BlendShape 是游戏和电影中面部表情制作的标准技术。通常为角色创建数十个表情目标,如微笑、皱眉、眨眼、张嘴等,通过组合权重产生丰富表情。
口型同步
根据语音音素制作对应的口型 BlendShape,在角色说话时实时混合,实现自动口型动画。
物体变形
可用于非角色物体,如汽车碰撞变形、布料褶皱、肌肉膨胀等。
实现方式
在建模软件中创建
在 Maya、Blender、3ds Max 等软件中,通过复制基础网格并雕刻出目标形状,然后导出为 BlendShape 或 Morph Target。这些软件支持权重绘画和动画关键帧。
在游戏引擎中使用
Unity 和 Unreal 均支持 BlendShape(Unity 称 BlendShapes,Unreal 称 Morph Targets)。引擎在导入模型时可识别并存储 BlendShape 数据,在动画系统中可通过曲线控制权重。
GPU 上的计算
BlendShape 计算通常在顶点着色器中进行。顶点数据包含基础位置、多个目标偏移量和对应权重,着色器计算加权和。对于大量 BlendShape,可使用计算着色器或合并通道优化性能。
优点与局限
**优点**:
- 能够表现非常精细的形变,不受骨骼结构限制。
- 直观的美术工作流:直接雕刻目标形状即可。
- 与骨骼动画兼容,可叠加使用。
**局限**:
- 每个 BlendShape 都需要存储完整的顶点偏移数据,占用较多内存,尤其是高模。
- 只能进行线性插值,对于非线性的复杂形变可能需要更多目标。
- 难以处理拓扑变化(如嘴巴张合造成的拓扑改变),通常需要保持一致拓扑。
数据压缩与优化
由于 BlendShape 数据量较大,常用压缩技术:
- 仅存储发生变化的顶点偏移,忽略静态顶点。
- 使用更低精度的浮点数(如半精度)存储偏移。
- 对于频繁组合的 BlendShape,可预先计算组合结果。
实践建议
- 合理规划 BlendShape 数量,避免过多导致内存暴涨。
- 使用对称镜像功能减少制作时间。
- 在引擎中利用遮罩或局部 BlendShape 减少计算量。
常见问题
BlendShape 和 Morph Target 是同一个概念吗?
是的,BlendShape 在 Autodesk Maya 中称呼,Morph Target 在 Unreal Engine 等中称呼,两者原理相同,都是通过顶点插值实现形变。
BlendShape 可以使用在哪些部位?
常用于面部表情、口型同步、肌肉膨胀、物体变形等。任何需要精细顶点级变形的场合都可考虑使用。
BlendShape 数据和骨骼动画数据哪个更占内存?
通常 BlendShape 数据占内存更大,因为每个目标形状都需要存储完整的顶点偏移数组;骨骼动画只需存储少数骨骼的变换。因此需要合理控制 BlendShape 数量。
BlendShape 能跟骨骼动画同时使用吗?
可以。在蒙皮计算后,叠加 BlendShape 变形,或反之。通常先应用骨骼蒙皮,再应用 BlendShape 偏移,但顺序可根据需求调整。
如何创建 BlendShape?
在 DCC 软件(如 Maya、Blender)中,复制基础网格,雕刻出目标形状,然后使用 BlendShape 工具关联到基础网格上。导出到游戏引擎时保留 BlendShape 信息。