关于unity3d 表情动画的问题,我之前在做项目的时候也用到了,所以今天就给大家说一下我项目里面用到的一些内容,项目需要用到morph动画来做人物表情,实践完了之后抽了点时间来记录一下。
3DMax或Maya做完Morpher动画导出的模型U3D是不支持的,反而一进来就会报错。U3D默认是不支持morpher动画的,具体理由我也不清楚。

不过,目前有两种方法可以实现Morpher动画的方法。

一、直接将两个模型进行对比,顶点渐变变形。

原理:读取两个模型,然后一个作为目标模型,一个作为初始模型,根据渐变参数来调用当前变形模型。

  1. function SetComplexMorph (srcIndex : int, dstIndex : int, t : float) { 
  2.    if (m_SrcMesh == srcIndex && m_DstMesh == dstIndex && Mathf.Approximately(m_Weight, t)) 
  3.       return; 
  4.    var v0 = m_Meshes[srcIndex].vertices; 
  5.    var v1 = m_Meshes[dstIndex].vertices; 
  6.    var vdst = new Vector3[m_Mesh.vertexCount]; 
  7.    for (i=0; i
  8.       vdst[i] = Vector3.Lerp(v0[i], v1[i], t); 
  9.  
  10.    m_Mesh.vertices = vdst; 
  11.    m_Mesh.RecalculateBounds(); 
  12. }

实际例子,参照U3D百科:
http://wiki.unity3d.com/index.php?title=MeshMorpher

二、用插件Mega-Fiers

Mega-Fiers插件是目前U3D作为各种变形插件最好最全的,不过其代码太多了,直接用还好,倘若你要改的话,还要研究半天。

Mega-Fiers里的morph功能是要配合插件一起用的,插件要向作者要。相当于作者写了个东西直接导出了一个morph的格式,然后在U3D里面读这个格式来实现MORPH功能。

1.插件来源:

a.直接上官网买正版,邮件给作者向他要附属插件。
b.U3D圣典论坛团购

2.具体用法:

官网教程:
http://www.west-racing.com/mf/?page_id=1096
http://www.west-racing.com/mf/?page_id=1108

相关视频和下载:
http://game.ceeger.com/forum/thread.php?fid=16&type=70

3.注意问题:

a.由于模型的渲染是引用而不是复制的,所以实例化的模型都是引用同一个地址的数据。当morph改掉当前模型的时候,其他引用也会相应变化。
所以只用单个模型的话用mega-fiers是完全没问题的,但多个同样的实例化模型在场景之中,那么所有的模型都会播放同样的morph动画。

b.假设你需要不同的实例化播放不同的morph的话,那么就需要修改mega-fires的源代码。
原理:复制一份模型,将渲染的引用指向复制的模型。
代码:找到MegaModifyObject.cs,在FindMesh方法的返回渲染引用之前加上下面代码。

  1. if (Application.isPlaying)
  2. {
  3.       Mesh temp = Mesh.Instantiate(skins[0].sharedMesh) as Mesh;
  4.       skins[0].sharedMesh = temp;
  5.       mesh = skins[0].sharedMesh;
  6. }


4.多动画的切换动画。
项目当中我并没有直接用插件的动画播放方式,而是自己写了一个储存、读取和播放的代码脚本。
原理:
a.写Editor编辑器,记录你所需要的动画播放信息到一个json或者xml。其实只需要记录是用哪几个通道,每个通道的开始百分比和结束百分比就可以了。
b.读取文件信息,反解析成类,读取相关来调用所编辑好的动画。