人物骨骼蒙皮动画系列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里,把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等口型插件已实现。

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity是一种常用的游戏开发引擎,它提供了强大的工具和功能,用于创建游戏中的各种效果,包括混合形状(Blendshape)和换装(Character Customization)。 Blendshape是一种通过改变模型顶点的权重来实现模型形状变换的技术。在Unity中,可以使用Blendshape来实现角色表情的动态变化。通过为角色模型创建不同的表情形状,然后在代码中根据需要修改这些形状的权重,就可以实现角色的表情变化。例如,可以通过修改眉毛、嘴巴、眼睛等部位的权重来改变角色的表情,从而使其看起来生动且有表情。 换装是一种角色定制的功能,允许玩家根据自己的喜好和需求为角色选择不同的服装、装备、发型等。在Unity中,可以通过使用骨骼动画和多个模型层来实现角色换装功能。首先,创建一个包含不同服装或装备的模型,然后在角色模型身上创建多个未连接的层,每个层代表一个装备选项。玩家可以通过更改模型层的权重或激活/取消激活层来实现角色的换装。 无论是使用Blendshape还是换装,Unity提供了简单易用的工具和接口来实现这些功能,开发人员只需要理解基本的概念和操作即可实现复杂的表情和换装效果。这些功能可以为游戏增加更多的个性化定制选项,并丰富游戏角色的表现力。 ### 回答2: Unity是一款强大的游戏引擎,它具有丰富的功能和工具,可以用于开发各种类型的游戏和应用程序。其中之一就是表情和换装的实现,主要借助于Unity内置的BlendShape系统。 表情在游戏或动画中扮演着重要的角色,可以让角色或模型更加生动和有表情。Unity的BlendShape是一种基于蒙皮的形变技术,它可以通过修改模型的顶点位置和权重来实现各种不同的表情变化。 首先,我们需要在Unity中导入一个包含表情变化的模型。然后,我们可以在Unity的模型导入设置中找到BlendShapes选项,启用它。在模型导入完成后,我们就可以在模型的inspector面板中看到BlendShape选项,里面包含了所有的表情。 接下来,我们可以通过在BlendShape滑块上调整权重来改变表情的强度。比如,如果我们想要改变模型笑的表情,我们可以将相应的滑块向右拖动。这将导致模型的某些顶点位置发生变化,从而形成一个笑容。 除了表情BlendShape还可以用于实现换装功能。我们可以为每一套服装或装备创建不同的表情,然后根据需要在游戏中切换它们。例如,当游戏角色穿上新衣服时,我们可以通过调整BlendShape滑块的权重,使得模型的顶点位置与新衣服相匹配,从而实现衣服的穿戴效果。 总结起来,Unity提供了强大的BlendShape系统,可以用于实现表情和换装功能。通过调整模型的顶点位置和权重,我们可以轻松地修改模型的表情,使其更加生动有趣。同时,通过切换BlendShape滑块的权重,我们可以实现角色的换装效果,让游戏更加丰富多样。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值