unity3d 表情动画

2015年01月31日 10:18 0 点赞 0 评论 更新于 2025-11-21 15:48

在之前的项目中,我用到了 Unity3D 实现人物表情动画的相关技术。项目需要使用 Morph 动画来制作人物表情,实践完成后,我抽出时间将相关内容记录下来,分享给大家。

3D 建模软件导出模型在 U3D 中的兼容性问题

在 3DMax 或 Maya 中完成 Morpher 动画后导出的模型,U3D 并不支持,模型导入 U3D 时会直接报错。目前,U3D 默认不支持 Morpher 动画,具体原因暂不明确。

实现 Morpher 动画的方法

方法一:直接将两个模型进行对比,顶点渐变变形

原理

该方法的原理是读取两个模型,将其中一个作为目标模型,另一个作为初始模型,然后根据渐变参数来调用当前变形模型。以下是实现该功能的代码示例:

function SetComplexMorph (srcIndex : int, dstIndex : int, t : float) {
if (m_SrcMesh == srcIndex && m_DstMesh == dstIndex && Mathf.Approximately(m_Weight, t))
return;
var v0 = m_Meshes[srcIndex].vertices;
var v1 = m_Meshes[dstIndex].vertices;
var vdst = new Vector3[m_Mesh.vertexCount];
for (i = 0; i < m_Mesh.vertexCount; i++) {
vdst[i] = Vector3.Lerp(v0[i], v1[i], t);
}
m_Mesh.vertices = vdst;
m_Mesh.RecalculateBounds();
}

实际例子

若需查看实际例子,可参照 U3D 百科:MeshMorpher

方法二:使用插件 Mega-Fiers

插件概述

Mega-Fiers 插件是目前 U3D 中功能最全面的各种变形插件。不过,该插件的代码量较多,如果只是直接使用,操作相对简单;但如果需要对其进行修改,则需要花费一定时间进行研究。

Mega-Fiers 里的 Morph 功能需要配合附属插件一起使用,附属插件需要向作者获取。作者编写了相关内容并导出了一个 Morph 格式,U3D 通过读取该格式来实现 Morph 功能。

插件来源

  • 购买正版:可直接上官网购买正版,然后通过邮件向作者索要附属插件。
  • 团购:可以参与 U3D 圣典论坛的团购活动获取。

具体用法

注意问题

  • 模型渲染引用问题:由于模型的渲染采用的是引用而非复制的方式,实例化的模型都引用同一个地址的数据。当 Morph 改变当前模型时,其他引用该数据的模型也会相应变化。因此,如果只使用单个模型,使用 Mega-Fiers 没有问题;但如果场景中有多个相同的实例化模型,所有模型都会播放相同的 Morph 动画。
  • 不同实例播放不同动画的解决方法:若需要不同的实例化模型播放不同的 Morph 动画,则需要修改 Mega-Fiers 的源代码。原理是复制一份模型,并将渲染的引用指向复制的模型。以下是具体代码,需在 MegaModifyObject.cs 文件的 FindMesh 方法返回渲染引用之前添加:
    if (Application.isPlaying) {
    Mesh temp = Mesh.Instantiate(skins[0].sharedMesh) as Mesh;
    skins[0].sharedMesh = temp;
    mesh = skins[0].sharedMesh;
    }
    

多动画的切换动画

在项目中,我没有直接使用插件的动画播放方式,而是自己编写了一个用于储存、读取和播放动画的代码脚本。具体原理如下:

  • 记录动画信息:编写 Editor 编辑器,将所需的动画播放信息记录到一个 JSON 或 XML 文件中。实际上,只需要记录使用的通道、每个通道的开始百分比和结束百分比即可。
  • 读取并播放动画:读取文件信息,将其反解析成类,然后根据相关信息调用编辑好的动画。