Unity 工具类 之 BlendShape 捏脸的实现

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


  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System.Linq;
  5. public class CharacterCustomization : Singleton{
  6. public string suffixMin = "Min";
  7. public string suffixMax = "Max";
  8. public SkinnedMeshRenderer target;
  9. SkinnedMeshRenderer skm;
  10. Mesh mesh;
  11. Dictionary BlendShapeDatabase = new Dictionary();
  12. private void Start()
  13. {
  14. Initialize();
  15. }
  16. public void Initialize()
  17. {
  18. skm = target;
  19. mesh = skm.sharedMesh;
  20. SaveBlendShapeDatabase();
  21. }
  22. #region 存储数据
  23. void SaveBlendShapeDatabase()
  24. {
  25. List BlendShapeNames = Enumerable.Range(0, mesh.blendShapeCount).Select(x => mesh.GetBlendShapeName(x)).ToList();
  26. for(int i = 0; BlendShapeNames.Count > 0;)
  27. {
  28. string noSuffix, altSuffix;
  29. noSuffix = BlendShapeNames[i].TrimEnd(suffixMax.ToCharArray()).TrimEnd(suffixMin.ToCharArray()).Trim();
  30. string positiveName = string.Empty;
  31. string negativeName = string.Empty;
  32. int postiveIndex = -1;
  33. int negativeIndex = -1;
  34. bool exist = false;
  35. //后缀是max
  36. if (BlendShapeNames[i].EndsWith(suffixMax))
  37. {
  38. positiveName = BlendShapeNames[i];
  39. altSuffix = noSuffix + " " + suffixMin;
  40. if (BlendShapeNames.Contains(altSuffix))
  41. exist = true;
  42. postiveIndex = mesh.GetBlendShapeIndex(positiveName);
  43. if (exist)
  44. {
  45. negativeName = altSuffix;
  46. negativeIndex = mesh.GetBlendShapeIndex(negativeName);
  47. }
  48. //后缀是min结尾
  49. }else if (BlendShapeNames[i].EndsWith(suffixMin))
  50. {
  51. negativeName = BlendShapeNames[i];
  52. altSuffix = noSuffix + " " + suffixMax;
  53. if (BlendShapeNames.Contains(altSuffix))
  54. exist = true;
  55. negativeIndex = mesh.GetBlendShapeIndex(negativeName);
  56. 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月8日
下一篇 2020年1月8日

相关推荐