目前实现捏脸功能的方式主要有两种。一个是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 捏脸整理及基于骨骼的捏脸功能实现的更多相关文章

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

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  2. Unity开发Android应用程序:调用安卓应用程序功能

    开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...

  3. 基于STC12C5A的MINI3216多功能点阵时钟

    代码地址如下:http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max72 ...

  4. php基于SQLite实现的分页功能示例

    php基于SQLite实现的分页功能. 这里操作数据库文件使用的是前面文章<PHP基于PDO实现的SQLite操作类>中的SQLite数据库操作类. 代码: <?php class ...

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

    自旋转矩磁阻随机存取存储器(ST-MRAM)有望成为一种快速,高密度的非易失性存储器,可以增强各种应用程序的性能,特别是在用作数据存储中的非易失性缓冲器时设备和系统.为此,everspin开发了基于9 ...

  6. HMS Core积极探索基于硬件耳返的功能,帮助唱吧整体唱歌延迟率降低60%

    唱吧的使命是让唱歌更简单.让生活更美好,其布局的K歌业务专注于让曲库更全.音质更好,开创了同框合唱.弹唱等有意思的游戏类K歌玩法.为了让用户拥有更加沉浸的娱乐体验,唱吧与HMS Core积极探索基于硬 ...

  7. Unity自学路线整理(参看微信公众号Unity墙外的世界的文章 )

    目前还是个新手. 发现自己有时候还是会一脸蒙...的对着电脑屏幕不知所措,为了利用好在大学零散的时间所以整理一下学习unity的路线. 计划好才能更好的利用时间. 1. 先学好C#再去看引擎,我看的是 ...

  8. Unity投影器细节整理

    抽了个空整理下投影器 一般投影器需要两张贴图,一张Cookie,一张FallOff. Unity提供Light和Multiple两种自带shader,和粒子类似. Cookie需要非alpha贴图,F ...

  9. 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。

    近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"?       解决方式:手 ...

随机推荐

  1. 学习笔记 C++ 链表

    今天查了不少关于链表的资料大概理解了链表,为记录只用留笔于此. 链表概述:动态的数据存储单元,可以比数组更加灵活. 链表的组成:存储的数据,下一个节点. 首先让我们用代码完成一个节点. class N ...

  2. System Error. Code:1722. RPC服务器不可用解决办法

    原文链接(转载请注明出处):System Error. Code:1722. RPC服务器不可用解决办法 问题 最近在软件设计上机课的时候,使用 starUML 建模工具画UML图的时候总是弹出一条如 ...

  3. C++相关:C++的IO库

    前言 基本的IO库设施 istream(输入流类型),提供输入操作. ostream(输出流类型),提供输出操作. cin,一个istream对象,从标准输入读取数据. cout,一个ostream对 ...

  4. 使用SQL命令批量替换WordPress站点中图片的URL链接地址

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=689 前言: 本文记录了使用SQL命令批量替换URL的方法以及除了替换URL之外,网站更换图片URL地址所必须的其他 ...

  5. JS 总结

    加var与不加var的区别: 简单来说就是加了var是局部变量 不加是全局变量.只有加了var的情况下就能限定该变量的使用范围 这样在别的方法里面也可以命名同样的变量了

  6. textarea去掉右下角拖拽

    /*去掉textarea右下角三角符号*/ resize : none;

  7. Firefox driver 那些事~

    1. selenium 3.x开始,webdriver/firefox/webdriver.py的init中,executable_path="geckodriver":而2.x是 ...

  8. VMware12安装虚拟机教程、Ubuntu16.04安装教程(包括vmware tools的安装)

    转自https://jingyan.baidu.com/article/c275f6ba07e269e33d756714.html 方法/步骤 1 虚拟机.Linux操作系统介绍及下载地址 虚拟机VM ...

  9. 第一天 Java语言概述

    一.什么是软件 软件就是按照特定的顺序把数据和指令组合在一起,能够完成相应功能的程序. 软件分为两种: 系统软件:专门用户运行其他程序的平台.比如Linux.Windows.MAC等 应用软件:完成相 ...

  10. upload.go

    package api import (     "os"     "bytes"     "mime/multipart"     &qu ...