3dmax顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画

这一篇也是入门难度,很简单。

目录:

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顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画_第1张图片

两种使用方式:

3dmax顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画_第2张图片

变形器放在蒙皮下面。

在3DMAX里,把benderShape的数值K到关键帧里。同时也可以K动画。

这样更方便展示复杂的表情与动画结合。

也可以不K,由程序来控制。

后者更灵活,跟动画文件的播放分离。


4.Unity导入BlendShapes的设置

导入模型后,勾选 Import BlendShapes

3dmax顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画_第3张图片

为了保证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的平滑处理计算。

3dmax顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画_第4张图片

2. 将Blend Shape Normals属性设置为Calculate,以便Unity使用相同的逻辑来计算网格和BlendShapes。

3dmax顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画_第5张图片

5. BlendShapes的代码使用

我们通过原理知道,BlendShapes是直接控制顶点的位移得到动画。

所以BlendShapes是存储在mesh里的。

所以任何预制体使用这个模型的mesh的话, skinnedMeshRender上会多出一个BlendShapes。

里面包含一到多个表情。

比如Beenhit这个,可以调节BlendShapes的权重, 值在0-100之间

BlendShape的权重表示将网格从其原始BlendShapes到目标BlendShape(另一个包含相同拓扑,但顶点位置与原始位置不同的Mesh)的混合量。

3dmax顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画_第6张图片

最简单的代码控制示例:

    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等口型插件已实现。

通过预先设置好不同口型、不同权重,根据语音元音调用不同口型。

你可能感兴趣的:(3dmax顶点动画导入unity_人物骨骼蒙皮动画系列3:Blendshape表情动画)