Unity 工具类 之 BlendShape 捏脸的实现
目录
Unity 工具类 之 BlendShape 捏脸的实现
一、简单介绍
二、实现原理
三、注意事项
四、效果预览
五、实现步骤
六、代码
七、参考工程
一、简单介绍
Blender 是一款开源的跨平台全能三维动画制作软件,提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。
在Unity程序开发中,使用 Blender 制作的模型,进行 BlendShap 捏脸的实现;
二、实现原理
1、通过控制改变 Skinned Mesh Renderer 的 BlendShapes 下的参数数值,来实现捏脸的效果
三、注意事项
四、效果预览
五、实现步骤
1、打开Unity,新建一个工程,并且导入模型,添加到场景中,如下图
2、在场景中,添加几个Slider UI 组件,控制捏脸的数值,如下图
3、编写脚本,控制BlendShapes 对应数值的变化,把对应脚本挂载到对应组件上,如下图
4、运行场景,效果如下
六、代码
1、Singleton
2、BlendShape
3、CharacterCustomization
-
using System.Collections;
-
using System.Collections.Generic;
-
using UnityEngine;
-
using System.Linq;
-
-
public class CharacterCustomization : Singleton
{
-
- public string suffixMin = "Min";
- public string suffixMax = "Max";
- public SkinnedMeshRenderer target;
- SkinnedMeshRenderer skm;
- Mesh mesh;
- Dictionary
BlendShapeDatabase = new Dictionary();
-
- private void Start()
- {
- Initialize();
- }
-
- public void Initialize()
- {
- skm = target;
- mesh = skm.sharedMesh;
- SaveBlendShapeDatabase();
- }
-
- #region 存储数据
-
- void SaveBlendShapeDatabase()
- {
- List
BlendShapeNames = Enumerable.Range(0, mesh.blendShapeCount).Select(x => mesh.GetBlendShapeName(x)).ToList();
- for(int i = 0; BlendShapeNames.Count > 0;)
- {
- string noSuffix, altSuffix;
- noSuffix = BlendShapeNames[i].TrimEnd(suffixMax.ToCharArray()).TrimEnd(suffixMin.ToCharArray()).Trim();
- string positiveName = string.Empty;
- string negativeName = string.Empty;
- int postiveIndex = -1;
- int negativeIndex = -1;
- bool exist = false;
-
- //后缀是max
- if (BlendShapeNames[i].EndsWith(suffixMax))
- {
- positiveName = BlendShapeNames[i];
- altSuffix = noSuffix + " " + suffixMin;
-
- if (BlendShapeNames.Contains(altSuffix))
- exist = true;
-
- postiveIndex = mesh.GetBlendShapeIndex(positiveName);
-
- if (exist)
- {
- negativeName = altSuffix;
- negativeIndex = mesh.GetBlendShapeIndex(negativeName);
- }
-
-
- //后缀是min结尾
- }else if (BlendShapeNames[i].EndsWith(suffixMin))
- {
- negativeName = BlendShapeNames[i];
- altSuffix = noSuffix + " " + suffixMax;
-
- if (BlendShapeNames.Contains(altSuffix))
- exist = true;
-
- negativeIndex = mesh.GetBlendShapeIndex(negativeName);
-
-
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!