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爪爪学院查找。

原文地址:https://www.cnblogs.com/jieke666/p/10775489.html

时间: 2024-10-05 20:44:03

Unity 捏脸整理及基于骨骼的捏脸功能实现的相关文章

这里整理了基于java平台的常用资源

这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.thanks. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Gradle采用增量构建.Gra

KINECT+opencv基于骨骼信息对视频进行动作识别

KINECT+opencv基于骨骼信息对视频进行动作识别 环境:kinect1.7+opencv2.4+vc2015 使用kinect获取并按批处理三维空间内的骨骼信息 基于视频帧差计算各关节运动向量并与本地模板匹配 目录 KINECTopencv基于骨骼信息对视频进行动作识别 目录 写在前面 对当前帧处理并匹配 kinect对帧的处理 与模板的向量余弦计算 根据动态时间规划法匹配 记录并保存模板到本地 使用opencv的FileStorage类生成xml文件 写在前面 自前一篇过去一周了.这次

基于Licode demo的屏幕共享功能的实现

基于Licode demo的屏幕共享功能的实现本文在licode的basicExample基础上添加screensharing功能.主要麻烦的是屏幕共享必须在https协议下传输,需要修改erizo controller的代码,而且https协议的证书问题也比较麻烦,目前的办法是手动添加证书到chrome中.chrome新版本需要使用插件screen capture,licode官方发布的插件不能直接在本地server上使用,需要修改后使用,下文将具体说. 1.index.html 修改,添加两

mysql基于init-connect+binlog完成审计功能

mysql基于init-connect+binlog完成审计功能 目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用它来完成审计功能. init-connect参数说明: http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_init_connect s

基于bootstrup的jQuery多功能模态对话框

这是一款非常实用的基于bootstrup的jQuery多功能模态对话框插件.该jQuery模态对话框集警告框.确认框和对话框于一体.是一款不可多得的多功能.多用途的模态对话框插件. 它的主要特点有: 可以通过AJAX直接将调用内容到对话框中. 可以在指定的时间后自动关闭对话框. 可以设置为点击模态背景不关闭对话框. 拥有丰富的回调函数. 在线演示:http://www.htmleaf.com/Demo/201502141378.html 下载地址:http://www.htmleaf.com/j

基于PHP实现用户注册登录功能

本文介绍的是基于PHP实现用户注册登录功能,本项目分为四部分内容:1前端页面制作,2验证码制作,3实现注册登陆,4功能完善.具体情况可以往下看. 验证码制作 一.实验简介 本次实验将会带领大家使用面向对象的思想封装一个验证码类.并在注册和登陆界面展示使用.通过本次实验的学习,你将会领悟到 PHP 的 OOP 思想,以及 GD 库的使用,验证码生成. 1.1 涉及到的知识点 PHP GD库 OOP编程 1.2 开发工具 sublime,一个方便快速的文本编辑器.点击桌面左下角: 应用程序菜单/开发

基于90nm CMOS技术的功能齐全的64Mb DDR3 STT-MRAM

自旋转矩磁阻随机存取存储器(ST-MRAM)有望成为一种快速,高密度的非易失性存储器,可以增强各种应用程序的性能,特别是在用作数据存储中的非易失性缓冲器时设备和系统.为此,everspin开发了基于90nmCMOS技术的全功能64Mb DDR3 STT-MRAM.存储器以8个存储区的配置进行组织,可支持1.6Giga Transfers/s(DDR3-1600).已经在800MHz的全64Mb上运行了标准的内存测试,例如March6N模式,其中0失败超过105个周期.还验证了从0°C到70°C的

Unity面试题整理

Unity技术面试题 一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行.换句话说,开启协程就是开启一个可以与程序并行的逻辑.可以用来控制运动.序列以及对象的行为. 二:Unity3d中的碰撞器和触发器的区别?答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性.当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数:当Is Trigger=true时,碰撞器被物理引

【原创整理,基于JavaScript的创建对象方式的集锦】

以下4种方式,是我在项目中最常见的JavaScript的面向对象的方式的开发. 测试一般在微软的工具:http://www.typescriptlang.org/Playground 进行测试,或者使用Firefox+FireBug 或者 WebStorm .......说了一大堆废话,我现在还是倾向使用typescript进行一般常规项目的开发了................... http://www.typescriptlang.org 1. (我在项目中最常用的) 基于 new 的方式