Unity3D Blend Shape简析

https://www.jianshu.com/p/4ae6662a40df

最近项目中要做表情,因此用到这个概念,但是却在网上找不到太多的了解,特地自己来记录一下。

什么是 Blend Shape?

  • 它其实是单个网格变形以实现许多预定义形状和任何数量之间组合的技术,在Maya/3ds Max 中我们称它为变形目标,例如单个网格是默认形状的基本形状(例如无表情的面),并且基本形状的其他形状用于混合/变形,是不同的表达(笑、皱眉、闭合眼皮),这些被统称为混合形状或变形目标。

如何使用 Blend Shape 制作表情呢?

  1. 要在 Maya 或者3ds Max 里面制作一个含有 Blend Shape 的形变动画 Avator。

  2. 把Avator导入到 Unity 中

  3. 给预制的 Avator 添加组件代码这里我们叫 BlendShapeDemo.cs,来控制 Avator 的表情变化,代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TestBlendShapeBehaviour : MonoBehaviour {
    
            int blendShapeCount;
            SkinnedMeshRenderer skinnedMeshRenderer;
            Mesh skinnedMesh;
    
            void Awake ()
            {
                 skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer> ();
                skinnedMesh = GetComponent<SkinnedMeshRenderer> ().sharedMesh;
            }
    
            void Start ()
            {
                blendShapeCount = skinnedMesh.blendShapeCount; 
            }
    
            void OnGUI()
            {
                //21,是指模型中设定发生形变张开嘴巴  0:左眼闭合 1:右眼闭合
                if (GUI.Button (new Rect (100, 100, 150, 80), "张开嘴巴 && 闭眼")) {
                    skinnedMeshRenderer.SetBlendShapeWeight (0, 100);
                    skinnedMeshRenderer.SetBlendShapeWeight (1, 100);
                    skinnedMeshRenderer.SetBlendShapeWeight (21, 100);
                }
                if (GUI.Button (new Rect (100, 200, 150, 80), "闭合嘴巴 && 睁眼")) {
                    skinnedMeshRenderer.SetBlendShapeWeight (0, 0);
                    skinnedMeshRenderer.SetBlendShapeWeight (1, 0);
                    skinnedMeshRenderer.SetBlendShapeWeight (21, 0);
                }
            }
    }
    

    SkinnedMeshRenderer就是含有 blendshapes 列表的渲染器,实施更改其中的权重,来改变其中的表情。



作者:慕久久
链接:https://www.jianshu.com/p/4ae6662a40df
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2020-03-30 13:22  00000000O  阅读(...)  评论(...编辑  收藏