首发知乎:https://zhuanlan.zhihu.com/p/616173667
绑定是CG动画制作流程中非常重要的一个环节,作为联系模型和动画的纽带,绑定保证了模型运动起来的效果也符合项目规范和审美标准,由绑定师制作和开发的各种工具可以很方便的让动画师快速实现自己想要的效果,在工作流中起到了承上启下的关键作用。
我们可以通过几个视频了解绑定的概念
恐怖动画短片《遗物》MAYA角色绑定展示
https://www.bilibili.com/video/BV1D44y157mb/
笔尖绑定
https://www.bilibili.com/video/BV15T4y117rX/
线性蒙皮与混合修型差异对照
https://www.bilibili.com/video/BV1Hq4y1f7Kx
在以往的游戏开发环节中,绑定往往是被忽视的一环。主要是受硬件条件限制的实时渲染环境无法支持绑定需要的各种复杂计算。随着算力的提高和算法的进步(移动平台除外),用户对产品品质要求也日益水涨船高,绑定流程也开始进入了游戏开发环节中。
绑定环节主要有三步,1:骨骼搭建,2:蒙皮,3:控制器搭建和驱动关系设计。这三个环节相互关联相互影响,在设计一套绑定方案的时候必须全面考虑才能得到最好的效果。同时,作为绑定环节的上游,模型的制作也会影响绑定设计和效果呈现。优秀的绑定师也必须对建模流程有所了解,或者模型对绑定环节有所了解,这样才能做到领域互补。很多模型规范是和绑定一起沟通指定的,比如布线位置,模型拓扑结构,挂件分配,UV分配等。
控制器搭建驱动关系设计则影响下游动画环节的表现。优秀的关节联动效果和驱动效果可以大大节省动画师的工作量,起到事半功倍的效果。而有些效果的则是靠动画师手工制作非常繁琐或者很难做到效果特别好的,比如汽车行驶时轮胎悬挂和地面的接触晃动,坦克履带运动,生物运动时的肌肉晃动,雨伞的开合,角色运动时盔甲的晃动等等。那么一个好的控制器设计可以把这些复杂的工作量一键化解。
综上所述,绑定师是一个横跨多个岗位的复合职位。他需要对资源制作中的模型材质流程有一定了解,这样才能有效沟通上游,也要有动画制作,基础代码能力,常见的动力学解算,约束关系,计算机对物体旋转和位移的计算,空间坐标换算等计算机图形学知识储备。这样才能高效率的驱动下游制作环节。可以说,绑定职位决定了动画和游戏美术生产管线中一半流程,其岗位含金量一点不比现阶段热门的TA或者图形程序低。在动画行业中,高级绑定师是离TD(Technical Director技术指导)最接近的行业。
因为绑定涉及的效果和技术面都非常广,一篇文章是写不完的,所以这里主要谈谈游戏或实时渲染中角色表现涉及的绑定工作流,这也是目前应用范围最广泛的部分。
游戏角色绑定涉及的范围主要有4大块,修型和肌肉运动效果,表情效果,服装运动效果,捏脸(身体)。我在几年前翻译的文章笼统的讲过战神4的制作流程,这里详细的介绍下相关操作步骤。
首先是角色修型,修型是动画和影视绑定流程中的一个基础模块,近几年也逐渐开始出现在游戏流程中。在介绍修型之前。我们要先了解下蒙皮的基础概念。
游戏和实时渲染中常见使用的方式是线性蒙皮。一个模型或者说一个网格体,是由N个顶点组成的。要想让模型动起来,最直接的方式就是修改顶点位置,因此我们需要记录每个顶点运动后的位置信息。假如一个模型有20000个顶点,那么需要记录的每帧位置信息就是20000*XYZ三个轴向的位移旋转和缩放信息,既180000个数据,如果动画帧数是每秒30帧,那一秒的动画数据就是5400000个数据。这个数据量随模型的精细程度和帧数增加成指数级放大,相当于每帧就是一个模型,ABC格式就是这个概念,这种数据格式一般用于影视行业。这么大的数据量用在实时渲染里肯定是不行的,一段几十秒的动画可能就几个G,没有哪个普通用户的设备能跑得动。而且同时操作这么多顶点也超过了人类的控制能力,那么为了简化计算量,我们会把顶点打组,用一个点去驱动N个顶点,这个点我们通常就叫骨骼(bone)。通过骨骼,我们可以把模型内一组大量的顶点运动数据简化为几个点的运动信息,这样需要存储的数据能成指数级减少。
既然有了骨骼,那么我们自然需要设计骨骼驱动顶点的方式。假如我们让骨骼影响范围内所有顶点都跟随骨骼同步运动,那最终的结果就是这个物体看起来就是一个硬邦邦的刚体。所以我们需要控制顶点跟随骨骼运动的范围。最简单的方式就是给顶点一个运动范围衰减,100%为完全跟随骨骼运动,0%为完全不跟随骨骼运动,映射到0-1范围,这个概念就叫权重。所以最终单个顶点的位置信息是由驱动骨骼的运动范围和顶点相对驱动骨骼的权重信息混合计算而来。这个计算方式就叫线性混合蒙皮(linear blending skinning)。公式我就不贴了,这种祖传算法随便一查就有。
线性混合蒙皮算法计算速度很快,但是它也有很大缺陷,就是不能维持模型体积。线性蒙皮本质是加减法,最终计算的结果一定是顶点会朝权重影响方向移动,那么在权重交界的地方,顶点位置会受多个骨骼位置影响。简单来说,在权重交界的地方,骨骼旋转的计算结果会导致顶点位置出现坍缩。
在算法上,这种问题可以通过双四元数蒙皮来解决,虚幻5新的animation deformer 系统也提供了双四元数蒙皮方案。相关案例可以在内容实例项目的animation graph关卡找到。但是一般在项目中,为了实时渲染性能优化考虑,我们还是会采用线性蒙皮的方式制作角色,通过绑定修型来解决线性蒙皮的形变问题,也就是俗话说的“工匠克算法”。
除了权重范围,蒙皮结果还会受权重数量影响。既一个顶点最多能被多少骨骼驱动。在移动平台通常是4个骨骼,在pc平台上限可以拓展到24。数量为4的倍数。更改此选项需要修改项目设置里skin相关设置。
回到刚才的话题,理解线性蒙皮方式的缺陷,就能理解为什么我们需要通过绑定来制作修型。最终目标是为了让模型运动起来的外形看起来顺眼和符合运动造型规律,不产生不符合审美的畸变和扭曲。
以手臂为例,线性蒙皮的角色手掌骨骼做翻转运动时会引起腕部形状畸变,而正常人类运动时,因为骨骼结构的影响,手腕翻转会带动腕部至肘部肌肉和皮肤组织一起运动,从而维持手臂体积(大家可以自行观察自己手臂感受一下)。我们可以通过架设骨骼的方式模拟这一运动效果。从手腕到手肘这段距离逐级添加twist骨骼,设置twist骨骼的X轴旋转值随手部骨骼旋转值递减,从而可以实现简单模拟手臂肌肉运动的效果。
twist修型效果对比
twist只是一个简单案例。架设修型骨骼是游戏中常用的绑定方式。UE5的默认角色小白人相比UE4版本增加了若干修型骨骼,主要是为了兼容meta human,这样可以最低限度的保证角色运动不产生过多的畸变。
为什么说是最低限度,因为这个修型骨骼数量太少了,无法还原角色运动时的肌肉形变效果,只能保证关节大致形状。要想实现比较好的效果,全身骨骼数量可能要增加到800——1000个。这也是线性流程的3A游戏角色常见骨骼数量。
UE5 骨骼版本
UE4骨骼版本
有了修型骨骼,我们需要知道怎样正确的驱动修型骨骼。twist骨骼的驱动逻辑比较简单,只需要把父骨骼的旋转值递减复制就可以。control rig和动画蓝图都可以做到,简单连几个节点就可以。这里单独提一下control rig,这是UE4后期版本开始加入的功能,专为处理游戏中实时绑定需求而开发。详细内容可以自行查阅官方文档。
图看不清没关系,这些都是小白人默认配置,随便建一个第三人称工程就有。如果你们使用的骨骼和虚幻官方小白人骨骼一致,那么你可以原封不动的copy官方蓝图使用。本文主要讲概念和原理,不会太多去写具体教程。所以具体的驱动逻辑和应用,还需要自己去消化官方的案例和教程。最好自己跟着做一遍,并且尝试各种驱动效果,才能完全理解骨骼设计和驱动之间的关系。简单提示一下,小白人的上臂和大腿关节的修型骨骼旋转值和父骨骼是相反的,至于为什么这么做,大家可以自行思考一下。
我们知道,关节运动不止只有扭曲(twist),还有摇摆(swing)。关节的YZ轴各个方向的旋转我们通常统称为摇摆。摇摆的修型相对扭曲更加复杂,因为姿势更多。同时摇摆运动伴随更多更复杂的肌肉挤压和拉伸效果。所以它的驱动关系就不是复制个旋转值这么简单了。首先,我们需要知道角色运动后各个关节pose状态,也就是模型的运动形态。写到这里,又一个概念登场了——blendshape,也叫morph,或者morph target。一般翻译为混合变形,或者变形目标。
blendshape算法很简单,就是加法。我们知道顶点的初始位置A,也知道它运动后的位置A+,那么把A和A+的差值记录下来,得到的这个结果就叫blendshape,简称BS。我们只需要在模型顶点的初始值上加上这个差值,就得到顶点运动后的位置。这个差值理论上可以无限加,也就是用BS做动画。不过一般不会这么做,因为这和一帧一个模型没任何区别。
那么BS和修型又有什么关系呢?我们可以事先做出模型在不同关节角度运动后的结果,存成BS,然后在骨骼运动的时候读取这个结果,这样就做到了修型效果。在我上面贴到战神4绑定制作分享中,战神团队大概制作了这么多pose模型。当然这里pose结果并不完全,人体的运动关节最少数量是16个,根据关节的活动范围不同,需要制作的pose模型数量最少应不低于54个。
maya中制作骨骼运动驱动BS的工具叫做姿势空间变形,pose space deformations,简称PSD。max没这个功能做不了。简单介绍就是在关节运动到一定角度的时候可以驱动一个BS,maya的psd工具允许你在关节运动角度状态下编辑模型,把编辑结果保存为BS,也可以读取事先制作好的BS。在虚幻引擎中,驱动这个效果的节点叫pose driver,姿势驱动器。
复盘这个流程,就是美术事先做出一堆运动状态下的模型,保存为BS,然后驱动它。说起来很简单,但是工作量令人头大。道理很明显,你做的pose越多效果越好。要实现复杂的肌肉运动效果,一个角色做几百个pose是很正常的事情。所以看起来一个角色只需要美术做一个模型,但是要想动起来效果好,一个角色可能要做几百个不同姿势的模型。
做出来bs后怎么实时驱动bs呢?主要方式有三种:
1:动画师手K。就是关节运动到一个范围内,手动设置对应关节的修型BS,可以用驱动关键帧实现。游戏中因为大部分都是播放的固定动画片段,所以可以把驱动结果bake成固定动画帧播放。这样对算力没有任何要求,只对人力有要求。不够缺点也显而易见,这并不是真实时,只是实时播放事先制作的结果而已。他不能模拟所有状态下的效果。随着游戏互动性的提高,越来越多的动画是程序化生成的,比如不同高度的攀爬,翻越,适应不同地形的行走效果等。这种预制作的效果瓶颈就显而易见了,预先做好的效果不能完全匹配实时计算出来的角色姿势。
2:通过关节旋转值计算。因为角色pose是根据关节旋转角度制作的。我们只要把关节相对初始位置的旋转角度映射到0-1范围就能得到驱动bs的权重值。这个做法实现起来简单,效果可控。蓝图或者control rig都可以做,就是做起来稍微有点麻烦,全是重复工作量。另外一堆连线很难整理,最好自己写个节点。旋转值驱动还有一个缺点就是多个pose同时存在的情况下,bs结果会有叠加问题。
3:rbf驱动。这也是虚幻pose driver节点提供的功能。RBF是径向基函数的缩写。关于RBF是啥具体可以参考这篇文章:
RBF可以做很多效果,计算BS差值只是其中一个应用,RBF还可以用于不同拓扑的网格体形状转递,计算表情权重等。具体描述优点就是,当多个姿势同时存在的时候,RBF没有叠加问题。某个姿势的权重越高,其他姿势的权重会对应减少。
这是我们整理的pose驱动需求表,详细列举了每个基础关节的运动轴向。看不清没关系,一般项目也没这种需求。
在UE5默认的第三人称工程中,其实已经提供了姿势驱动的效果模板。只不过驱动的结果是骨骼位置。其实原理是一样的。因为驱动大量BS也就是顶点位置计算量巨大,所以将BS转成骨骼,这样我们只需要计算几个骨骼的位置信息就可以了,大大节省算力需求。所以把顶点运动信息转成骨骼并计算骨骼权重是一种优化手段,主要使用ssdr(线性蒙皮分解)算法实现。相对于BS,骨骼优点更明显,第一,通用性更强,权重合理的情况下,一套骨骼可以驱动不同拓扑的角色。第二,可以量产。第三,已经说过了,骨骼计算速度更快。
maya的RBF插件和ssdr插件满大街都是,知道怎么用就行了,除非有特殊需求,一般没必要自己开发。
所以综合起来,3A级角色绑定环节中的修型流程就是:美术事先做出一堆不同运动状态下的pose模型,保存为BS,然后转化成骨骼权重和动画信息。再把骨骼动画转成pose资源,在找个方式驱动这些pose,就完了。
是不是很简单?当然,这是目前的做法,下一代的做法已经开始引入机器学习来驱动形变结果了。不过无论算法怎么迭代,第一步,也是成本最高的那一步,始终是绕不开的,就是需要一堆数据结果来驱动,而这个数据结果,目前并没有高效率低成本的生产方式,还是需要人工制作。
修型算是绑定流程中一个比较常见且工作量较大的环节。基本涵盖了骨骼设计,模型制作,驱动关系设计等领域,绑定涉及的面非常琐碎不可能面面俱到都讲全。因为只能挑在工作流中占比较大的部分讲。下一篇打算写表情,具体描述如何从0开始制作一套metahuman或者snapper的表情绑定系统。彻底抛弃UE的DNA节点限制并实时驱动。
相关阅读:
建立下个时代的高清游戏美术资源生产管线(一):摄影测量建模
建立下个时代的高清游戏美术资源生产管线(二):材质与纹理规范——场景篇
建立下个时代的高清游戏美术资源生产管线(三):细节与质感
建立下个时代的高清游戏美术资源生产管线(四):角色服装篇
原文:https://zhuanlan.zhihu.com/p/616173667