最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity3d 表情动画
在之前的项目中,我用到了 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 文件中。实际上,只需要记录使用的通道、每个通道的开始百分比和结束百分比即可。
- 读取并播放动画:读取文件信息,将其反解析成类,然后根据相关信息调用编辑好的动画。