关于unity3d 表情动画的问题,我之前在做项目的时候也用到了,所以今天就给大家说一下我项目里面用到的一些内容,项目需要用到morph动画来做人物表情,实践完了之后抽了点时间来记录一下。
3DMax或Maya做完Morpher动画导出的模型U3D是不支持的,反而一进来就会报错。U3D默认是不支持morpher动画的,具体理由我也不清楚。
不过,目前有两种方法可以实现Morpher动画的方法。
一、直接将两个模型进行对比,顶点渐变变形。
原理:读取两个模型,然后一个作为目标模型,一个作为初始模型,根据渐变参数来调用当前变形模型。
实际例子,参照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方法的返回渲染引用之前加上下面代码。
4.多动画的切换动画。
项目当中我并没有直接用插件的动画播放方式,而是自己写了一个储存、读取和播放的代码脚本。
原理:
a.写Editor编辑器,记录你所需要的动画播放信息到一个json或者xml。其实只需要记录是用哪几个通道,每个通道的开始百分比和结束百分比就可以了。
b.读取文件信息,反解析成类,读取相关来调用所编辑好的动画。
3DMax或Maya做完Morpher动画导出的模型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
- vdst[i] = Vector3.Lerp(v0[i], v1[i], t);
- m_Mesh.vertices = vdst;
- m_Mesh.RecalculateBounds();
- }
实际例子,参照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方法的返回渲染引用之前加上下面代码。
- if (Application.isPlaying)
- {
- Mesh temp = Mesh.Instantiate(skins[0].sharedMesh) as Mesh;
- skins[0].sharedMesh = temp;
- mesh = skins[0].sharedMesh;
- }
4.多动画的切换动画。
项目当中我并没有直接用插件的动画播放方式,而是自己写了一个储存、读取和播放的代码脚本。
原理:
a.写Editor编辑器,记录你所需要的动画播放信息到一个json或者xml。其实只需要记录是用哪几个通道,每个通道的开始百分比和结束百分比就可以了。
b.读取文件信息,反解析成类,读取相关来调用所编辑好的动画。