Unity人物动画SALSA With RandomEyes (语音生成嘴型/人物说话) 使用

Posted 里约热内驴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity人物动画SALSA With RandomEyes (语音生成嘴型/人物说话) 使用相关的知识,希望对你有一定的参考价值。

SALSA使用探索

之前做项目时想实现人物说话的效果,因为我们的语音是AI合成的,有很多片段,如果能根据语音生成嘴部的动画,那将极大便利我们的工作。后面是找到了SALSA的这款插件,并摸索出使用方法。

1 插件介绍

官方网站https://crazyminnowstudio.com/

这是一个能做2D纸片人和3D人物模型嘴部和眼睛动画的插件,由两人组成的独立工作室(疯狂米诺工作室)开发。

插件全名为SALSA With RandomEyes,2014年上架Asset Store,目前是已下架,替换为新版本,名为SALSA LipSync Suite。那么我们为什么不用新版本呢?问的好,因为…找不到能白嫖的资源,咳咳。

2 插件使用

最开始看官网的英文文档看不下去,就直接把插件导进来自己研究了,下面是使用探索的过程。

2.1 导入插件

插件不大,20多M,里面包含官方示例模型。

蓝奏云下载链接https://guichai.lanzout.com/ipKZSyjd1pc(仅供学习用途,请购买正版)

2.2 官方示例

2.2.1 BlendShape

找到里面 Examples 中的 Models 文件夹,里面有3个模型文件夹,我们用 Ethan 里面的这个人形模型。

(顺便吐槽一句,官方的其他几个示例模型太难看了喂,找个美工做点好看的示例模型不行嘛,销量肯定能增一增啊喂)

模型拖到场景里,选择 char_ethan_body 这个子物体,看到 Skin Mesh Rendered 组件下有一个 BlendShapes,展开它。

这是个网格变形器,里面能看到不少可以调的参数。我们随便拉动一个,能看到人物脸部会发生相应变化。
这里重要的是前三个 (saySmall/sayMedium/sayLarge),它是控制人物嘴型的。

2.2.2 Salsa 3D (嘴部动画)

给这个带BlendShape的物体加上 Salsa 3D 脚本。此时Audio Source组件也会被自动加上,因为这个脚本运行是依赖声音的。

看到第三个参数 Audio Clip 为空,我们可以点击右侧圆形图标随便 加一段音频

然后可以点击 Auto-link Shapes,此时三个嘴型 (SaySmall/SayMedium/SayLarge) 会被自动匹配上,这个对应的就是前面讲的BlendShapes里面的那三个参数。

运行游戏,可以看到人物开始说话了。由此可以知道,插件是通过控制着三个嘴型来实现嘴部的动画效果的。

(脚本后面还有一些参数,可以对说话动画进行修改,各位自行调试看效果,这里就不讲了)

2.2.3 RandomEyes3D (眼部动画)

眼部动画也是类似的。添加 RandomEyes3D 脚本,看到下面 Look Up/Down/Left/Right 这些参数了吧,就是控制人物眼球转动的。然后还有一个 Blink,控制的是眨眼。

这里我不点Auto-Link,因为所有效果都加上,人的眼睛会左右上下的动,看起来实在太睿智。

所以我就只做个眨眼效果,把 Blink 改下。其实还应该把其他的设为 None,可惜没有这个选项。

运行游戏,能看到人物眼睛随机时间间隔进行眨动。

3 人物建模

3.1 思路

插件的原理是根据音频的波形形状,混合三种不同的初始嘴型产生相应的嘴型,那我们的人物模型必须包含这三个初始嘴型 (BlendShape)

将示例人物模型导入3D max中,能看到BlendShape 对应max中 变形器 这个修改器,我们可以就此入手。

第一种思路,也是最合乎情理的思路,就是给现成的人物面部绑骨。绑好骨骼后,通过控制下颌骨实现人物嘴部开合,并调节嘴唇周围肌肉的形状,就能做出这3个嘴型,最后加到变形器里就可以了。

但因为我不会人物面部的绑骨,所以找到第二种方法。

第二种思路,通过Character Creator人物模型制作软件,生成我们初始的人物模型。这个软件生成的模型是附带全身骨骼的,不需要我们绑骨。其次,软件生成的模型也生成了变形器,能控制嘴部的肌肉。

我们可以直接通过这个带骨骼和变形器的人物模型来进行操作,省去前面的麻烦。

3.2 过程

3.2.1 CC生成裸模

使用 Character CreatorHeadshot 插件,可以根据照片直接生成模型,非常方便。导入照片等插件运行完,我们细调一下脸部,再调整一下身高大小就可以导出了。

3.2.2 MD制作衣物

在CC中其实是有衣服模型的,但比较少,没有我们想要的。使用 Marvelous Designer 可以制作服饰,我们需要一件短袖加长裤,软件里面刚好自带了这个模板,就直接套用了。

3.2.3 MAX制作嘴型

鞋子模型网上随便找一个,在 3ds Max 给人加上。使用 蒙皮包裹修改器 把衣服的绑定问题解决。后面就是嘴型制作,主要是通过下颌骨骼与生成模型中自带的变形器完成。那么做好后就可以导入Unity里使用了。

3.2.4 详细流程

具体的操作如下,这是当时写的开发文档。导入Unity后还有些要处理的问题,后面部分没截了,反正应该没人真的想做吧。

Unity人物跳跃效果

  最近在做一个小游戏,需要实现人物的跳跃效果。自己从简单到复杂,把目前比较好的方法都试了一遍,这里简单总结一下。

  1.直接使用动画位移

     这个其实是美术在做动画的时候已经做好的东西,跳跃的动画本身就含有位移,只需要在应用动画的时候勾选Apply Root Motion就可以了。但是简单也有问题,就是跳跃的高度无法控制,不够灵活。不过对于新手来说先试一下,至少人物能动起来,心里美滋滋。

 

   2.使用刚体组件加作用力

     这个其实就是利用Unity的刚体组件,模拟真实的物理效果。在跳跃的时刻给物体添加一个向上的瞬时作用力,这样就能模拟跳跃的效果。这个使用场合还是很多的。但是也有毛病,刚体模拟跳跃还需要勾选重力(当然也可以给物体一个向下的恒力),但是大多数情况下我们是不需要重力的,而且使用物理会消耗更多资源(相比脚本)。这个网上也有很多例子,一行代码搞定,不详细介绍。

 

   3.自己写脚本模拟跳跃

   这个是应用场景最多的方式。简单的,可以定义跳跃的时间和高度,然后开协程每帧更新物体的高度,这样就能实现跳跃,具体见下面代码。但是这种跳跃是线性的,无法模拟真实跳跃,更加无法实现自定义跳跃的曲线。

 1     public int jumpTime = 30;
 2     public int fallTime = 20;
 3     public float jumpHeight = 1f;
 4     void JumpForSeconds()
 5     {
 6         StartCoroutine(jumpForSeconds());
 7     }
 8 
 9     IEnumerator jumpForSeconds()
10     {
11         int time = jumpTime;
12         float speed = jumpHeight / jumpTime;
13         while(time>0)
14         {
15             time--;
16             transform.Translate(transform.up * speed);
17             yield return new WaitForEndOfFrame();
18         }
19         time = fallTime;
20         speed = -jumpHeight / fallTime;
21         while(time>0)
22         {
23             time--;
24             transform.Translate(transform.up * speed);
25             yield return new WaitForEndOfFrame();
26         }
27     }

 

   4.使用AnimationCurve

   这里只介绍简单的使用方法。AnimationCurve是Unity可视化的曲线模拟组件,需要在挂载的脚本中public声明一个AnimationCurve类型的变量,如public AnimationCurve jumpCurve; 此时可以发现inspector视图中脚本多出来一个

单击后面的编辑框即可打开编辑界面,打开后如图

在这里可以编辑你想要的曲线类型,跳跃就是简单的抛物线,你也可以自定义任何类型的曲线。具体如何编辑曲线,可以查看官方文档https://docs.unity3d.com/Manual/EditingCurves.html,写的十分详细。吐槽一下这里的曲线只能用定义关键帧的方式来画,并没有预定义好的曲线。如果能做成matlab那样强大就好了,当然也可能是游戏中其实不需要那么复杂的曲线。

接下来如何使用这条曲线呢,其实你可以把刚才定义的变量jumpCurve理解为这条曲线,它提供了很多方法,最常用的就是Evaluate函数,这个函数参数为x,返回y值,也就是你可以根据横轴任意一点得到曲线上的某一点。在跳跃的例子中,横轴就是时间,纵轴就是高度,那么我们稍微修改一下方法3,高度由这个曲线每帧获取,然后定义物体高度就可以了。  

 1     void JumpForSeconds()
 2     {
 3         StartCoroutine(jumpForSeconds());
 4     }
 5 
 6     IEnumerator jumpForSeconds()
 7     {
 8         int time = 0;
 9         float x = 0;
10         float z = 0;
11         float height = 0;
12        while(time<=jumpTime)
13         {
14              x = transform.position.x;
15              z = transform.position.z;
16              height = jumpCurve.Evaluate(time);
17             transform.position = new Vector3(x, height, z);
18             yield return new WaitForEndOfFrame();
19             time++;
20         }
21     }

 

顺便再多说一点,这个AnimationCurve十分强大,像道路生成、运动轨迹等都可以使用。

 

以上是关于Unity人物动画SALSA With RandomEyes (语音生成嘴型/人物说话) 使用的主要内容,如果未能解决你的问题,请参考以下文章

我在MAX做好的人物骨骼动画导入UNITY 中出问题,人物模型乱七八糟,怎么回事呢?

unity如何将人物的动画连接起来,就是做好的两个人物动画,通过一个按键可以控制这两个动作按顺序执行

用3dMax给lol人物模型制作表情动画并导入Unity

怎么通过程序控制unity3d人物动作

Unity2d人物移动+动画控制

Unity人物跳跃效果