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

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

目前实现捏脸功能的方式主要有两种。一个是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爪爪学院查找。

相关文章
|
1月前
|
C# 图形学 开发者
【Unity3D实例-功能-镜头】俯视角
本文介绍了Unity中常用的俯视角镜头实现方法,涵盖模型添加、角色Tag设置、摄像机脚本编写及测试运行,帮助开发者快速掌握俯视角在策略与模拟类游戏中的应用技巧。
193 0
|
1月前
|
人工智能 定位技术 C#
【Unity3D实例-功能-移动】通过鼠标点击进行角色移动
本文介绍了如何在Unity中实现鼠标点击控制角色移动的功能。通过安装导航网格、设置地图与角色、烘焙路径及编写脚本,带领读者一步步构建角色自动寻路系统,增强游戏交互体验。
96 0
|
2月前
|
C# 图形学 开发者
【Unity3D实例-功能-移动】复杂移动(Blend Tree方式)
本文介绍了使用Unity中Blend Tree实现角色移动控制的完整教程,涵盖动画器设置、Blend Tree创建、CharacterController组件添加及代码控制,帮助开发者实现流畅自然的角色动画效果。
72 0
|
2月前
|
图形学 开发者
【Unity3D实例-功能-移动】角色移动-通过WSAD(CharacterController方式)
本文介绍了如何在Unity中使用CharacterController组件实现角色灵活移动。内容包括模型准备、动画处理、添加组件、编写移动脚本及测试运行,帮助开发者快速掌握角色控制技巧,打造流畅的游戏体验。
129 0
|
2月前
|
C# 图形学 开发者
【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)
本文介绍了如何在Unity中使用Rigidbody组件实现角色自由移动,包括模型准备、组件添加、脚本编写与测试运行,帮助开发者快速掌握基础角色控制技巧。
158 0
|
2月前
|
C# 图形学
【Unity3D实例-功能-移动】角色移动-通过WSAD(Transform方式)
本文介绍了如何在Unity中实现角色移动功能,使用Transform组件控制角色基础移动,并详细讲解了模型导入、动画设置、动画控制器配置及移动脚本编写等内容,适合Unity初学者学习角色控制的基础知识。
100 0
|
7月前
|
图形学 UED
unity Tab键实现切换输入框功能
该脚本用于简化输入框之间的Tab键切换操作。只需将脚本挂载在InputField上,无需其他设置。脚本通过监听Tab键和Shift键组合,自动选择下一个或上一个可交互的InputField,提升用户体验。
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解
|
机器学习/深度学习 图形学 Windows
小功能⭐️unity3d KeyCode各键值说明
小功能⭐️unity3d KeyCode各键值说明

热门文章

最新文章