这一篇也是入门难度,很简单。
1.3D动画分类
2.为什么使用blendShape
3. 3DMAX或Maya导出BlendShapes的两种使用方式
4.Unity导入BlendShapes的设置
5. BlendShapes的代码使用
6.AnimationCurve来可视化控制权重
7.配合语音的口型表情
1.3D动画分类:
1.Morph (渐变,变形),对应3DMAX的blendShapeDeformer
是一种顶点插值动画。
2.关节动画: Rigid Skinning 、刚性蒙皮。
3.骨骼动画,SkinMesh
表情动画blendShape,就是一种Morph应用。
2.为什么使用blendShape:
因为骨骼数量比较消耗性能,一般引擎最大限制4骨骼。
3. 3DMAX或Maya导出BlendShapes的两种使用方式:
1.启用导出动画。
2.启用导出变形模型的混合形状。
两种使用方式:
变形器放在蒙皮下面。
在3DMAX里,把benderShape的数值K到关键帧里。同时也可以K动画。
这样更方便展示复杂的表情与动画结合。
也可以不K,由程序来控制。
后者更灵活,跟动画文件的播放分离。
4.Unity导入BlendShapes的设置
导入模型后,勾选 Import BlendShapes
为了保证blendShapes过程中,法线不出错,法线相关的光照没问题,Unity的官方文档给出两种导入方式:
(我使用的本地文档)
file:///C:/Program%20Files/Unity/Hub/Editor/2020.1.11f1c1/Editor/Data/Documentation/en/Manual/FBXImporter-Model.html
1. 将“混合形状法线”属性设置为“导入”,以便Unity使用FBX文件中的法线。
注意:导入混合形状法线需要在FBX文件中进行平滑处理。
可以在3DMAX导出时就导出平滑信息,也可以使用Unity的平滑处理计算。
2. 将Blend Shape Normals属性设置为Calculate,以便Unity使用相同的逻辑来计算网格和BlendShapes。
5. BlendShapes的代码使用
我们通过原理知道,BlendShapes是直接控制顶点的位移得到动画。
所以BlendShapes是存储在mesh里的。
所以任何预制体使用这个模型的mesh的话, skinnedMeshRender上会多出一个BlendShapes。
里面包含一到多个表情。
比如Beenhit这个,可以调节BlendShapes的权重, 值在0-100之间
BlendShape的权重表示将网格从其原始BlendShapes到目标BlendShape(另一个包含相同拓扑,但顶点位置与原始位置不同的Mesh)的混合量。
最简单的代码控制示例:
SkinnedMeshRenderer skin;
int blendShapeCount;
int blendSpeed = 1;
void Update ()
{
if (blendOne < 100f) {
play(0,blendOne);
blendOne += blendSpeed;
}
else
{
stopAll();
}
}
//注意:我们可以一次play多个blendshape,做复杂表情
void play(int index,float weight) //index指明是哪个blendShape动画
{
//设置某个BlendShape权重,也就是播放BlendShape动画
skin.SetBlendShapeWeight (index, weight);
}
void stopAll()
{
//blendShapeCount代表blendShape数量, 模型可以附带多个blendShape动画,比如微笑、大笑、哭泣等。
int blendShapeCount= skin.sharedMesh.blendShapeCount;
for (int index= 0 ; index< blendShapeCount; index++)
{
//BlendShape权重=0时,停止BlendShape动画
skin.SetBlendShapeWeight (index, 0);
}
}
6. 使用AnimationCurve来控制权重
为了在Unity里更可视化的控制调节表情的的权重变化,我们可以对每个表情配置一个AnimationCurve,然后序列化。在运行期通过AnimationCurve来控制权重。
我们对上面代码稍做修改
AnimationCurve tAnimationCurve;
void play(int index)
{
float nowWeight = Mathf.Lerp(skin.GetBlendShapeWeight(index), tAnimationCurve.Evaluate(Time.time), nowtime/ Time.time);
skin.SetBlendShapeWeight (index, nowWeight);
}
7.配合语音的口型表情
Lipsync、FaceFX等口型插件已实现。
通过预先设置好不同口型、不同权重,根据语音元音调用不同口型。