Unity项目捏脸解决方案BlendShapes

  • 引子
  • BlendShapes
  • 具体使用
    • 代码
  • 参考链接

引子

最近公司在开发一个捏脸的SDK,使用的核心功能就是使用Unity的SkinnedMeshRenderer上的BlendShapes来实现的。这个功能在Maya和3ds Max中都可以找到。

BlendShapes

BlendShapes是一种动画制作方式,与骨骼动画相比,它主要应用在很小的局部,比如角色的面部表情。
骨骼只适合控制整体的动作,但太局部的动作使用骨骼制作会非常繁琐,同时太多的骨骼对性能也有影响。
BlendShapes的原理很简单,就是在相邻两个网格间做插值运算,从一上形状融合到另一个形状;或者说是单个网格变形以实现许多预定义形状和任何数量之间组合的技术,在Maya/3ds Max中我们称它为变形目标,例如单个网格是默认形状的基本形状(例如无表情的面),并且基本形状的其他形状用于混合/变形,是不同的表达(笑、皱眉、闭合眼皮),这些被统称为混合形状或变形目标。所以美术只要制作若干个形状的模型即可,比摆骨骼要方便很多,特别是对于面部这种很局部的动作来说。
模型在导入时,Import BlendShapes选项默认是选中的。

具体使用

  1. 要在Maya或者3ds Max里面制作一个含有BlendShapes的形变动画Avator
  2. Avator导入到Unity中。
  3. 导入的模型上面有组件SkinnedMeshRenderer,面板上有BlendShapes参数,它的下面有一连串的数值可以手动或编码设置,来实现捏脸效果。

代码

Unity提供的一些相关接口(组件SkinnedMeshRenderer中):

  • void SetBlendShapeWeight(int index, float value):用于直接设置BlendShape的值,使用index按照面板上的自上而下顺序下标来索引设置的“部位”。
  • float GetBlendShapeWeight(int index):根据index获取对应的BlendShape值。
  • sharedMesh.blendShapeCount:组建中BlendShape的数量。
  • sharedMesh.GetBlendShapeName(int shapeIndex):根据index获取对应的BlendShape名称字符串。
  • sharedMesh.GetBlendShapeIndex(string blendShapeName):根据名称获取索引的下标(第几个)。

这里我只用了了几个,还有一些并没有使用测试过。

  • void AddBlendShapeFrame(string shapeName, float frameWeight, Vector3[] deltaVertices, Vector3[] deltaNormals, Vector3[] deltaTangents):添加一个新的BlendShape框架。
  • int GetBlendShapeFrameCount(int shapeIndex):返回BlendShape的帧数。
  • void GetBlendShapeFrameVertices(int shapeIndex, int frameIndex, Vector3[] deltaVertices, Vector3[] deltaNormals, Vector3[] deltaTangents):检索BlendShape框架的deltaVertices,deltaNormals和deltaTangents。
  • float GetBlendShapeFrameWeight(int shapeIndex, int frameIndex):返回BlendShape框架的权重。

之后下面是我使用的一个脚本,当使用的一个模型(FBX)下有好多分支模型节点时,使用这个脚本统一管理设置BlendShape

using UnityEngine;public class BlendShapeModel : MonoBehaviour
{private SkinnedMeshRenderer[] skinnedMeshRenderers;private string[] m_bsNameAll;void Start(){//获取初始化skinnedMeshRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();m_bsNameAll = new string[skinnedMeshRenderers.Length];for (int i = 0; i < skinnedMeshRenderers.Length; i++){for (int j = 0; j < skinnedMeshRenderers[i].sharedMesh.blendShapeCount; j++){m_bsNameAll[i] += skinnedMeshRenderers[i].sharedMesh.GetBlendShapeName(j) + ',';}}}/// <summary>/// 设置BlendShape值/// </summary>/// <param name="name">BlendShape的名字</param>/// <param name="value">BlendShape设置的值</param>public void SetBlendShapeValue(string name, float value){for (int i = 0; i < m_bsNameAll.Length; i++){if (m_bsNameAll[i].Contains(name)){int lenght = m_bsNameAll[i].IndexOf(name);int index = m_bsNameAll[i].Substring(0, lenght).Split(',').Length - 1;skinnedMeshRenderers[i].SetBlendShapeWeight(index, value);}}}
}

代码中,我是使用的名称检索对应的BlendShape,所以各个分支所对应的相同的BlendShape的名称要有相同的字符串,或一定的规律。

参考链接

  1. BlendShapes:https://www.jianshu.com/p/b8c1210dd12e
  2. Unity3D Blend Shape简析:https://www.jianshu.com/p/4ae6662a40df
  3. Unity工具类之BlendShape捏脸的实现:https://blog.csdn.net/u014361280/article/details/103929611

Unity项目捏脸解决方案BlendShape相关推荐

  1. 【游戏开发Unity】捏脸系统(附源码)

    本着"没有捏脸系统算什么RPG"的想法,着手做一个2d简易捏脸demo.其实换装游戏都差不多啦~ github代码地址:Simple-Character-Edit-System ( ...

  2. Unity 工具类 之 Blender 的下载和简单使用(为捏脸做准备)

    Unity 工具类 之 Blender 的下载和使用(为捏脸做准备) 目录 Unity 工具类 之 Blender 的下载和使用 一.简单介绍 二.下载地址 三.安装 四.简单使用 1.设置成中文界面 ...

  3. Unity 捏脸整理及基于骨骼的捏脸功能实现

    目前实现捏脸功能的方式主要有两种.一个是Blendshape(融合变形),一个是基于骨骼驱动的方式,通过修改骨骼矩阵(bindpose)来影响SkinMesh.这两种方式的最终原理都是在shader ...

  4. unity 捏脸相关

    捏脸 https://blog.csdn.net/u014361280/article/details/103929611?depth_1-utm_source=distribute.pc_relev ...

  5. unity捏脸游戏捏脸系统实现原理和代码

    unity捏脸游戏捏脸系统制作教程 unity3d捏脸系统实现原理和代码 捏脸实现原理 unity捏脸系统要用到3D建模软件,我用的是blender 不会用blender的朋友,请看这个链接: htt ...

  6. 骨骼捏脸功能的实现方法

    这是第132篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...

  7. 如何打造细致的2D捏脸系统

    大家好,我是汉家松鼠的CG,<江湖X>.<汉家江湖>的制作人和主程,今天给大家介绍一下我们游戏中的捏脸系统是如何设计和开发的. 背景介绍 游戏<汉家江湖>是我们一款 ...

  8. 《赛博朋克2077》是捏脸游戏?上科大学生社团开发了一款赛博“滤镜”

    作者 | eEhyQx 出品 | AI科技大本营 现象级大作<赛博朋克2077>终于没有跳票顺利发布了!你通关了吗? 来自上海科技大学的学生社团GeekPie打造了一款全新的"滤 ...

  9. 虚幻4 捏脸和换装系统实现

    http://blog.csdn.net/shangguanwaner/article/details/50392896 虚幻4 捏脸和换装系统实现 捏脸和换装系统基本上是一个游戏的标配了,这里记录下 ...

  10. 自定义角色外观之捏脸

    "捏脸"和"换装"在游戏中一般用来实现自定义角色外观的功能,今天先来说说"捏脸","换装"放在下一篇博文中介绍.所谓捏脸 ...

最新文章

  1. 设置sql*plus的sqlprompt
  2. amd一键超频怎么用_头条信息流“一键起量”工具怎么用?经验分享
  3. Pixhawk之姿态解算篇(2)_mahony算法分析
  4. 优先级队列 c语言,使用最小堆使用优先级队列(c语言版本)
  5. superset可视化-word cloud
  6. 机器学习实践七----异常检测和推荐系统
  7. 深度学习之主流数据库 | MySQL基础
  8. 中国农业大学计算机学院博士,[北京]中国农业大学工学院农业机器人团队
  9. 一个完整的接口技术解决方案(一)
  10. [推荐]中国网管的知识宝库-网管之家
  11. centos7下docker-mysql5.7实现主从复制(精简教程)
  12. 淘宝x-sign, x-mini-wua, x-sgext, x-umt挂unidbg分析
  13. C/C++ 木材加工
  14. 坚持系统观念 推动综合交通统筹融合发展
  15. elasticsearch自定义打分操作
  16. 安卓EROFS (Read-only file system)的解决
  17. 浅论定点DSP与浮点DSP的区别
  18. 桌面计算机性能监控系统,监视 Windows 桌面应用的使用情况和性能 - Azure Monitor | Microsoft Docs...
  19. Lumerical Python API学习笔记(一):Lumopt配置以及样例运行
  20. Unity 开发总结之onValueChanged事件

热门文章

  1. 区块链游戏企鹅大陆面世了,会是腾讯的区块链游戏吗?
  2. python自动化办公-提取excal表格某列数据
  3. Sharepoint 列表关联Title字段设置
  4. 【音视频基础】H264格式分析
  5. Centos8 更换DNF源
  6. STEAM 教育相关书籍
  7. Linux_Ubuntu快捷键截屏
  8. Mininet-wifi安装和简单使用
  9. 离散数学知识点总结(3):等值演算,16个命题定律 / 基础等价式,重言式的替换规则,证明有效性和可满足性的方法
  10. sql统计各部门的的男女员工数