人物换装和捏脸_unity 骨骼捏脸-程序员宅基地

技术标签: 捏脸  unity3d  融合动画  纸娃娃  换装  

1 换装

目前的换装方案主要有:

  • 材质换装,比如换贴图和shader
  • 挂点,在角色上制作挂点,然后挂上武器飘带等
  • 更改蒙皮(Unity中为Skin Mesh Render),只要所有的蒙皮基于同一套骨骼开发,就支持换装。在换装的时候SkinMeshRender重新复制bone信息就可以完成蒙皮的绑定。通过合并Mesh减少Drawcall。
  • uma系统。DNA系统(设置骨骼缩放系数和长度)。

换装实现

实现参考
SkinMeshRender改变模型Transform无效是因为模型上的顶点位置已经是实时通过骨骼位置和权重实时计算出来的。所以对Unity中带有skinMeshRenderer组件的GameObject进行移动,旋转等操作,并不会影响模型的最终渲染。
参考核心代码
该代码没有对mesh进行优化,可以对skinmeshrender进行合并来优化,减少recall,优化采用CombineInstance对mesh进行合并

CharacterCustomization

代码根据性别加载主骨架,再根据角色装扮信息读取各部件资源中的所有蒙皮信息生成新的Mesh,将Mesh与子物体中所有的bones,materials赋予父物体的SkinnedMeshRenderer中。
官方的换装粒子,不修改代码不能再unity5中运行。换装原理是更改蒙皮和合并mesh。换装时有内存泄露。原因是并没有从内存中清除(AssetBundle),不断的更换就会在内存中不断的累加。

UMA

UMA分为改变Wardrobe(换装),Color(皮肤颜色),DNA(设置骨骼(T-pose)矩阵) 换装的核心原理为更改蒙皮+合并mesh。 SkinnedMeshCombiner.cs–>CombineMeshes 会合并骨骼和顶点MergeSortedTransforms(按照hash的大小排序骨骼)把所有的顶点合并成一个mesh

对美术的要求

制作的所有衣服基于同一套完整骨骼,导出的时候导出衣服和衣服所受影响的那些骨骼,动画可以不需要。

2 捏脸

有二种方式。一是用Blendshape(融合变形),通常用于面部动画,直接修改顶点。二就是用骨骼驱动,采用修改骨骼矩阵的方式影响SkinMesh。二种方式最终的目的都是修改顶点。

blendShape(Morph Target)实现原理

How the software does this blending, as explained by some of the other answers written here, is achieved by the delta or the differences in shape between the target expressions and the base shape. Maya keeps track of how much each vertex is displaced in relation to the original Base shape. Thus when the animator blends or morphs the expression in, Maya translates those vertices towards the final positions as described by that particular BlendShape.

Since Maya compares the base shape and the BlendShape objects vertex for vertex, we should always maintain consistency in vertex count, vertex order or topology across all BlendShapes.

UMA捏脸系统(DNA)

UMA的骨骼男女角色层次结构一样为

人物骨骼一共158块骨骼

UMADynamicCharacterAvatar
-Root
--Global
---Position
----Hips
-----LowerBack
------LowerBackAdjust
-------LowerBackBelly
------Spine
-------Spine1
--------Neck
---------Head
----------RightEar
-----------RightEarAdjust
----------RightEye
-----------RightLowerLid
------------RightLowerLidAdjust
-----------RightEyeAdjust
-----------RightUpperLid
------------RightUpperLidAdjust
-----------RightEyeGlobe
----------RightLipsSuperiorMiddle
-----------RightLipsSuperiorMiddleAdjust
----------LeftLipsSuperiorMiddle
-----------LeftLipsSuperiorMiddleAdjust
----------RightEyebrowLow
-----------RightEyebrowLowAdjust
----------NoseBase
-----------NoseBaseAdjust
----------RightLowCheek
-----------RightLowCheekAdjust
----------LipsSuperior
-----------LipsSuperiorAdjust
----------RightNose
-----------RightNoseAdjust
----------HeadAdjust
----------LeftEyebrowMiddle
-----------LeftEyebrowMiddleAdjust
----------LeftEar
-----------LeftEarAdjust
----------LeftEye
-----------LeftEyeAdjust
-----------LeftEyeGlobe
-----------LeftUpperLid
------------LeftUpperLidAdjust
-----------LeftLowerLid
------------LeftLowerLidAdjust
----------LeftNose
-----------LeftNoseAdjust
----------NoseTop
-----------NoseTopAdjust
----------RightCheek
-----------RightCheekAdjust
----------NoseMiddle
-----------NoseMiddleAdjust
----------UpperLips
-----------UpperLipsAdjust
----------LeftEyebrowUp
-----------LeftEyebrowUpAdjust
----------RightEyebrowUp
-----------RightEyebrowUpAdjust
----------LeftCheek
-----------LeftCheekAdjust
----------Mandible
-----------LeftLipsInferior
------------LeftLipsInferiorAdjust
-----------RightLowMaxilar
------------RightLowMaxilarAdjust
-----------RightLips
------------RightLipsAdjust
-----------LipsInferior
------------LipsInferiorAdjust
-----------MandibleAdjust
-----------RightLipsInferior
------------RightLipsInferiorAdjust
-----------Tongue01
------------Tongue02
-----------LeftLips
------------LeftLipsAdjust
-----------LeftLowMaxilar
------------LeftLowMaxilarAdjust
----------RightEyebrowMiddle
-----------RightEyebrowMiddleAdjust
----------LeftLowCheek
-----------LeftLowCheekAdjust
----------LeftEyebrowLow
-----------LeftEyebrowLowAdjust
---------NeckAdjust
--------RightOuterBreast
---------RightInnerBreast
--------RightShoulder
---------RightTrapezius
---------RightArm
----------RightArmAdjust
----------RightForeArm
-----------RightForeArmAdjust
-----------RightForeArmTwist
------------RightForeArmTwistAdjust
-----------RightHand
------------RightHandFinger03_01
-------------RightHandFinger03_02
--------------RightHandFinger03_03
------------RightHandFinger05_01
-------------RightHandFinger05_02
--------------RightHandFinger05_03
------------RightHandFinger04_01
-------------RightHandFinger04_02
--------------RightHandFinger04_03
------------RightHandFinger02_01
-------------RightHandFinger02_02
--------------RightHandFinger02_03
------------RightHandFinger01_01
-------------RightHandFinger01_02
--------------RightHandFinger01_03
---------RightShoulderAdjust
--------LeftOuterBreast
---------LeftInnerBreast
--------Spine1Adjust
--------LeftShoulder
---------LeftShoulderAdjust
---------LeftTrapezius
---------LeftArm
----------LeftForeArm
-----------LeftHand
------------LeftHandFinger04_01
-------------LeftHandFinger04_02
--------------LeftHandFinger04_03
------------LeftHandFinger01_01
-------------LeftHandFinger01_02
--------------LeftHandFinger01_03
------------LeftHandFinger02_01
-------------LeftHandFinger02_02
--------------LeftHandFinger02_03
------------LeftHandFinger03_01
-------------LeftHandFinger03_02
--------------LeftHandFinger03_03
------------LeftHandFinger05_01
-------------LeftHandFinger05_02
--------------LeftHandFinger05_03
-----------LeftForeArmTwist
------------LeftForeArmTwistAdjust
-----------LeftForeArmAdjust
----------LeftArmAdjust
-------SpineAdjust
-----LeftUpLeg
------LeftLeg
-------LeftLegAdjust
-------LeftFoot
--------LeftToeBase
------LeftUpLegAdjust
------LeftGluteus
-----RightUpLeg
------RightGluteus
------RightLeg
-------RightFoot
--------RightToeBase
-------RightLegAdjust
------RightUpLegAdjust

用于修改DNA的骨骼有一共74块,其中Adjust骨骼大部分为单位矩阵,skinMesh大部分绑定在这些可修改的骨骼上,在名为***adjust骨骼上没有动画数据,UMA2动画采用avatar人形骨骼系统进行重定向。
用于调整的骨骼有:

HeadAdjust
NeckAdjust
LeftOuterBreast
RightOuterBreast
LeftEye
RightEye
LeftEyeAdjust
RightEyeAdjust
Spine1Adjust
SpineAdjust
LowerBackBelly
LowerBackAdjust
LeftTrapezius
RightTrapezius
LeftArmAdjust
RightArmAdjust
LeftForeArmAdjust
RightForeArmAdjust
LeftForeArmTwistAdjust
RightForeArmTwistAdjust
LeftShoulderAdjust
RightShoulderAdjust
LeftUpLegAdjust
RightUpLegAdjust
LeftLegAdjust
RightLegAdjust
LeftGluteus
RightGluteus
LeftEarAdjust
RightEarAdjust
NoseBaseAdjust
NoseMiddleAdjust
LeftNoseAdjust
RightNoseAdjust
UpperLipsAdjust
MandibleAdjust
LeftLowMaxilarAdjust
RightLowMaxilarAdjust
LeftCheekAdjust
RightCheekAdjust
LeftLowCheekAdjust
RightLowCheekAdjust
NoseTopAdjust
LeftEyebrowLowAdjust
RightEyebrowLowAdjust
LeftEyebrowMiddleAdjust
RightEyebrowMiddleAdjust
LeftEyebrowUpAdjust
RightEyebrowUpAdjust
LipsSuperiorAdjust
LipsInferiorAdjust
LeftLipsSuperiorMiddleAdjust
RightLipsSuperiorMiddleAdjust
LeftLipsInferiorAdjust
RightLipsInferiorAdjust
LeftLipsAdjust
RightLipsAdjust
Global
Position
LowerBack
Head
LeftArm
RightArm
LeftForeArm
RightForeArm
LeftHand
RightHand
LeftFoot
RightFoot
LeftUpLeg
RightUpLeg
LeftShoulder
RightShoulder
Mandible

天涯明月刀捏脸系统设计原理

融合变形

优点:可以控制的非常细微捏脸变化。

缺点:Blendshape在捏脸制作上工作量非常大,我想把一个结构捏的多么细微就要制作多少张脸,这个细微度和工作量是成正比的。这样会导致后期修改不方便,更重要的是性能消耗非常大。另外跟我们第三方动画软件不兼容。

骨骼驱动

优点:制作量比较少,性能消耗相对少些,和现有动画系统兼容,另外捏脸骨骼和动画骨骼是同一套骨骼,就通过MorphemeConnect动画软件跟面部骨骼做了融合。当你捏出来任何形状的脸都可以套用同一个动画,这样也减少很大的工作量。

缺点:权重分配受限较多,捏练的细致程度有限。

总结

  1. 骨骼捏脸(48根骨骼)
  2. 软件的法线贴图 + 开发的表情法线贴图
    做法:动画软件跟二套表情法线进行融合,表情法线和本身模型的法线进行了叠加,表情法线会设置0到100的透明度
  3. 骨骼有位移,旋转和缩放功能
    image
  4. 眼球有瞳孔diffuseMap通道,不同眼球大小瞳孔贴图有UV挤压(?暂时不理解)
    image
  5. (老化项,我们同样制作了衰老皮肤的二套法线,并提供了0-100的渐变功能可使角色面部,变化出不同的年龄层次,再加上捏脸功能可以让角色变的更加丰富。)(?按图片理解是法线贴图+表情法线贴图+老化法线贴图)
    image
    image
    image

《Honey Select》捏人剖析

总结

  1. HS中的的头部骨骼, 全部是用于捏脸的, 表情动画使用MorphTargets驱动
  2. 身体影响顶点的骨骼名字全部带有"s"字样, 其父骨骼都是不带"s"的同名骨骼. HS的身体骨架中, 父骨骼负责动画, 子骨骼负责蒙皮.
  3. 博文总结
脸型(或体型)调整原理就是:
本质上修改的是骨骼的Local Transform(Translation, Rotation, Scale)
一次只修改Local Transform的某个分量(或多个):Tx/Ty/Tz/Rx/Ry/Rz/Sx/Sy/Sz
使用滑杆在预设的调节范围之间进行插值
插值不一定是线性的, 可能是有多个关键帧
每个调节项可能对应不只一根骨骼

捏脸总结

  1. 基于骨骼调整。调整骨骼的Scale、Rotation,Position相对用得少。
  2. 基于Mesh差值。这部分是前面缺失没有提到的部分,在某些骨骼数量有限制或者骨骼不能做得特别好的情况下,会制作两个最大和最小极值的mesh,根据差值计算中间的mesh值,然后在运行时生成最终显示的mesh,和调整骨骼的区别有点类似于骨骼动画和网格动画。
  3. 基于材质。在网格不修改的情况下,材质的变化用于肤色、瞳孔颜色、唇色、纹身图案等等,都可以通过材质中的贴图或者参数更改来改变。(UV的变化可以做到纹身颜色的自定义等等)
  4. 新的Mesh。这部分在《HoneySelect》中也有讲到,也是对于程序来说最为简单,对美术来说工作量最大的部分,用于发型、时装、多余的饰品挂件等等。

参考制作:

https://docs.unrealengine.com/latest/CHN/Engine/Content/FBX/MorphTargets/index.html
http://jjyy.guru/unity-animation

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a352614834/article/details/79435549

智能推荐

Python读取和操作Excel(.xlsx)文件_python打开或创建.xlsx文件,并获取活动表单-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏38次。Python读取Excel使用openpyxl库来控制excel文件(即.xlsx为后缀的文件)。这里介绍一下excel数据的结构。打开excel文件后生成一个workbook(工作簿)每个工作簿中包含多张表单worksheet正在操作的表单被称为活跃表单active sheet对于某一特定行和列的小格子称为单元格cell安装使用pip安装,pip install openpyxl简单的步骤import openpyxl # 导入openpyxl模块wb = openpyxl.loa_python打开或创建.xlsx文件,并获取活动表单

进阶篇---Soft Actor-Critic (SAC)_soft actor critic 为什么需要两个网络-程序员宅基地

文章浏览阅读1.5k次。进阶篇—Soft Actor-Critic (SAC)SAC是一个off-policy + actor critic + maximum entropy的RL算法。比DDPG,SVG等方法稳定并且效果更好。代码参见我的GitHub前言1、on-policy 与 off-policy:on-policy:“边交互边学习” ,每一次参数更新时,都需要与环境交互,因而当遇到复杂任务时,需要的更新步骤更多,增大了复杂度off-policy :“重用过去的经验”,典型的就是经验池策略的方法,比如DQN,DD_soft actor critic 为什么需要两个网络

spring bean的循环引用-程序员宅基地

文章浏览阅读203次。看过一次spring公开课,记录一下bean的循环引用问题。问题:public class IndexService{  @Autowired  IndexDao indexDao;}public class IndexDao{  @Autowired  IndexService indexService;}以上的实例中IndexService依赖..._spring bean循环引用

Docker结合Jenkins部署vue项目_docker jenkins vue-cli-程序员宅基地

文章浏览阅读3.1k次。Docker结合Jenkins部署vue项目接上篇Vue项目没什么好说的,在本地一般使用vue ui启动vue管理的前端,然后在里面进行启动Vue官方说可以不通过ngin来部署,但是如果上生产环境,建议还是要走nginx安装nginx这里安装过程不再赘述,如果不清楚可以参考下面这篇文章https://blog.csdn.net/qq_42815754/article/details/8..._docker jenkins vue-cli

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_redis+mysql读写分离流程-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏15次。Redis—redis结合lnmp架构做mysql的缓存服务器文章目录一 、redis结合lnmp架构做mysql的缓存服务器实现读写分离(一)在server1中配置nginx(二)在server2中配置redis(三)在server3上安装mysql(四)建立php和redis,mysql的连接(五)浏览器访问测试一 、redis结合lnmp架构做mysql的缓存服务器实现读写分离读写分离..._redis+mysql读写分离流程

zabbix-agent被动模式变为主动模式_zabbixmoban改为主动模式-程序员宅基地

文章浏览阅读1.1k次。zabbix-agent被动模式变为主动模式配置server2:[root@server2 ~]# vim /etc/zabbix/zabbix_agentd.conf 98 Server=172.25.83.1139 ServerActive=172.25.83.1 #主动模式下,需要配置的。123 # StartAgents=3浏览器:配置——>模板——>Te..._zabbixmoban改为主动模式

随便推点

0x00007FF9A7F72079 (ucrtbased.dll)处引发的异常: 0xC0000005: 写入位置 0x000000094D100000 时发生访问冲突_0x00007fffbd9cac87 (ucrtbased.dll)处(位于 mysql c++连接-程序员宅基地

文章浏览阅读1.7w次,点赞22次,收藏11次。此类型错误,需要更改为其temp中name数组的长度,在scanf_s中需要添加,在scanf中不需要。_0x00007fffbd9cac87 (ucrtbased.dll)处(位于 mysql c++连接.exe 中)引发的异常: 0

TiDB 混沌工程实践:如何打造健壮的分布式系统?-程序员宅基地

文章浏览阅读181次。本文转载自 InfoQ 网站作者:唐刘策划:赵钰莹原文链接:https://www.infoq.cn/article/bxGvrb_CxAZD6Wv3fUj8作为一个分布式数据库,TiDB 面临的严重挑战在于如何让用户相信存储在 TiDB 里面的数据是安全的,不会出现丢失,损坏等情况..._唐刘 tidb

android中的activity跳转动画_android13车载系统使用activity跳转动画-程序员宅基地

文章浏览阅读536次。仿微信页面平移跳转,android中的Activity跳转动画_android13车载系统使用activity跳转动画

SAP实现多个统御科目:特殊总账SGL+备选统驭科目Alternative Reconciliation Accounts_sap特别总账科目调账-程序员宅基地

文章浏览阅读7.9k次,点赞2次,收藏8次。问题: 客户或供应商因多种业务,需要多个统御科目1、特殊总账 SGL一个客户或供应商或资产默认只有一个统驭科目,F-02记账的时候,若不选特别总账标示,则记账在主记录中的统驭科目中,一般为应收应付。若关于此客户、供应商、资产等有非应收应付业务发生时,比如预收、预付、信用证、保证金等,此时记账虽然记账在客户供应商上,但不需要记账在往来科目上,此时就需要选择特别总账_sap特别总账科目调账

android常用控件ViewPager(二) ViewPager与Fragment_fragment viewpage2获取子fragment-程序员宅基地

文章浏览阅读355次。在上一篇中提到过ViewPager通常和Fragment一起使用来达到View的切换效果。为此google也提供了两个与Fragment的适配器。分别为 FragmentPagerAdapter与FragmentStatePagerAdapter。前者会缓存三个Fragment。后者在我们切换不同的Fragment的时候,我们会把前面的Fragment销毁。但会把我们的我们Fragment的Bund_fragment viewpage2获取子fragment

在pycharm中运行pytest报错ModuleNotFoundError: No module named 'pytest'_pycharm控制台执行“pytest” 报错:assert mod not in mods-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏3次。萌新记录一下安装pytest后在pycharm中运行出现的错误,及解决方法问题本人萌新一个,一开始还以为自己pytest和pycharm安装的盘不一样导致的,全部卸了重安,网上的解决方案也试了全部没用,最后找了朋友帮忙。其实只是命名有问题,pytest的文件名称必须为test_.py或_test.py我之前的名称中有空格所以出现问题,修改之后就没有问题了感谢朋友,记录这个小问题..._pycharm控制台执行“pytest” 报错:assert mod not in mods

推荐文章

热门文章

相关标签