Unity 捏脸整理及基于骨骼的捏脸功能实现
目前实现捏脸功能的方式主要有两种。一个是Blendshape(融合变形),一个是基于骨骼驱动的方式,通过修改骨骼矩阵(bindpose)来影响SkinMesh。这两种方式的最终原理都是在shader 生效之前修改顶点。
融合变形
优点:可以控制非常细微的变化,通常用于面部动画。
缺点:Blendshape在捏脸制作上工作量非常大,我想把一个结构捏的多么细微就要制作多少张脸,这个细微度和工作量是成正比的。这样会导致后期修改不方便,更重要的是性能消耗非常大。另外跟我们第三方动画软件不兼容。
骨骼驱动
优点:制作量比较少,性能消耗相对少些,和现有动画系统兼容,另外捏脸骨骼和动画骨骼是同一套骨骼,就通过MorphemeConnect动画软件跟面部骨骼做了融合。当你捏出来任何形状的脸都可以套用同一个动画,这样也减少很大的工作量。
缺点:权重分配受限较多,捏脸的细致程度有限。
由于大多数使用Unity 开发的游戏都希望最终部署在移动平台上,综合考量时间成本,性能消耗和实际需求,以下介绍基于骨骼驱动的捏脸方案。(后续会整理出融合变形的方案)
什么是骨骼?为什么通过骨骼能够调整脸型?
骨骼是一些具有层次结构的“关节”点(在Unity 中是仅有一个根节点的树状的空物体)构成的,其引入最初是希望能籍此方便实现仿生动画,其核心原理简而言之就是通过骨骼带动“皮肤”(mesh)来运动,也就是通过移动骨骼(对骨骼做动画)并根据骨骼和皮肤的关系来计算mesh 跟随骨骼运动后所在的位置。
骨骼及蒙皮机制:
1.将绑定姿势(即模型原始状态,如人形模型的T型结构)状态下的模型(蒙皮)顶点(世界坐标)变换到各个骨骼空间下。
2.将骨骼变换(移动、旋转、平移)到新位置。
3.根据骨骼和蒙皮关系,将绑定姿势下的模型(蒙皮)顶点(骨骼空间下)变换到新的世界位置。
初始位置(绑定姿势)
骨骼变换后位置
1.计算小臂上一点S在小臂空间中的位置。
这个就要根据初始的骨骼位置和mesh上顶点的位置来计算了,也就是常说的绑定姿势状态。先说一下该例中每个坐标的意义:
(x1,y1,z1):左肩关节SL的世界坐标。
(x2,y2,z2):左肘关节在以左肩关节为原点的坐标系本地坐标。
(x3,y3,z3):附着于左小臂上的皮肤上的一点S的世界坐标。
这里为了简单,假设所有的关节都没有经过平移和缩放。实际上的变换一般会通过矩阵来表示。在Unity 中可以通过transform 之间的父子关系及子节点的local 信息组合出模型矩阵(即将骨骼空间坐标转到世界空间下的矩阵),然后通过求其逆矩阵获得绑定姿势矩阵(如果无法理解建议补充矩阵和空间变换的基本图形学知识):
绑定姿势矩阵
根据绑定姿势矩阵,我们可以将蒙皮上的顶点的世界坐标转化到骨骼空间下。
2.计算EL顺时针旋转90°后S点的位置。
直接通过左肩SL,左肘关节EL的缩放、旋转、平移信息计算小臂LA空间的模型矩阵,使用上一步算出的小臂LA空间坐标乘以该模型矩阵即算出了该点收到骨骼移动的影响后的位置。
模型矩阵反推变换后的蒙皮顶点世界坐标
3.顶点混合
顶点可能不止受到一个骨骼的影响,需要根据权重混合多个骨骼计算出新的世界坐标点。这也是为什么顶点受到骨骼影响越多,性能越差的原因。
总结:利用蒙皮与骨骼相对位置不变的性质,通过不变的bindpose 矩阵和变化的model 矩阵将蒙皮的世界坐标变换到实际的位置。
更多unity2018的功能介绍请到paws3d爪爪学院查找。
Unity 捏脸整理及基于骨骼的捏脸功能实现的更多相关文章
- 这里整理了基于java平台的常用资源
这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- 基于STC12C5A的MINI3216多功能点阵时钟
代码地址如下:http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max72 ...
- php基于SQLite实现的分页功能示例
php基于SQLite实现的分页功能. 这里操作数据库文件使用的是前面文章<PHP基于PDO实现的SQLite操作类>中的SQLite数据库操作类. 代码: <?php class ...
- 基于90nm CMOS技术的功能齐全的64Mb DDR3 STT-MRAM
自旋转矩磁阻随机存取存储器(ST-MRAM)有望成为一种快速,高密度的非易失性存储器,可以增强各种应用程序的性能,特别是在用作数据存储中的非易失性缓冲器时设备和系统.为此,everspin开发了基于9 ...
- HMS Core积极探索基于硬件耳返的功能,帮助唱吧整体唱歌延迟率降低60%
唱吧的使命是让唱歌更简单.让生活更美好,其布局的K歌业务专注于让曲库更全.音质更好,开创了同框合唱.弹唱等有意思的游戏类K歌玩法.为了让用户拥有更加沉浸的娱乐体验,唱吧与HMS Core积极探索基于硬 ...
- Unity自学路线整理(参看微信公众号Unity墙外的世界的文章 )
目前还是个新手. 发现自己有时候还是会一脸蒙...的对着电脑屏幕不知所措,为了利用好在大学零散的时间所以整理一下学习unity的路线. 计划好才能更好的利用时间. 1. 先学好C#再去看引擎,我看的是 ...
- Unity投影器细节整理
抽了个空整理下投影器 一般投影器需要两张贴图,一张Cookie,一张FallOff. Unity提供Light和Multiple两种自带shader,和粒子类似. Cookie需要非alpha贴图,F ...
- 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。
近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"? 解决方式:手 ...
随机推荐
- SpringMVC SessionAttributes 简述
使用SpringMVC时,我们会发现网络上有关SessionAttributes注解的内容非常少,更多的人甚至推荐你继续用HttpServletRequest中的session管理方法来控制Sessi ...
- Qt中绘制五子棋棋盘
一个需要做大作业的同学问我相关内容,就顺手写了一个,贴出来. 项目包含头文件 mainwindowh,源文件mainwindow.cpp和主函数main.cpp. 如下: mainwindow.h # ...
- 2014金山笔试_编写一个数组类 MyVector
//编写一个数组类 MyVector,数组内容可以动态扩充,实现构造,析构,赋值操作符重载,插入,删除,获取元素个数,获取数组容量(不可以使用STL等的容器类,不能使用 //不连续的存储空间) #in ...
- Cookie熟知
Cookie能干什么 会话(cookie,session)技术的一种.因为http协议是无状态的,每次都是基于一个请求一个响应.每次请求和响应都跟上次没有关系.我们需要记录之前对话信息.cookie技 ...
- NoHttp封装--03 缓存
1.Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头. StringRequest req ...
- var与let、const的区别
var与let.const 一.var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100;console.log(a,window.a); // 100 1 ...
- Python_驻留机制
#coding=utf-8 #coding:utf-8 #- * -coding:utf-8 - * - '''以上为注明字符串的编码格式''' #驻留机制 '''Python支持短字符串驻留机制,对 ...
- 原生 JavaScript 实现扫雷
学习了这么长时间的 JS,不能光看不练,于是就写了个小游戏练习一下.因为自己还是个菜鸟,所以有错误的话还请各位大佬多多指点,谢谢啦~ 如果感兴趣的话可以试试:Demo 项目地址:game-mineSw ...
- C++11 左值、右值、右值引用
左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...
- Windows 安装 Vue
引言 在公司 linux 环境下安装不顺利,回家在 windows 下操作感觉到一种幸福 nginx 先安装了 nginx,其实跟 vue 没关系,只是打算用它做 web 服务,此处略过 nginx ...