骨骼驱动的软体角色动画
2021-05-13吕依娜
吕依娜
(四川大学计算机学院,成都610065)
0 引言
近些年来,随着电影、游戏和虚拟现实应用的快速发展,计算机三维动画技术因为能够创造逼真的视觉效果,而被广泛用于这些行业之中。在动画领域中,骨骼动画技术因其控制简单高效的优点,成为最常见的虚拟人动画技术之一。而如何让动画中的三维虚拟角色更加栩栩如生成为目前热门的研究方向之一。
骨骼动画的核心思想是在虚拟角色内部构建一副具有层次结构的骨架,为骨骼和皮肤网格顶点定义一种映射关系,使皮肤网格顶点与骨骼绑定,这个过程也称为蒙皮。蒙皮完成后,就可以用骨架来驱动附着在其上的皮肤运动,生成虚拟角色动画。骨架的运动数据可以由动画师定义,也可以通过动捕设备获得。常见的蒙皮方法有LBS(Linear Blend Skinning)[1]和DQS(Dual Quaternion Skinning)[2],它们的优点是计算快速,但都有关节塌陷和走样的问题。通过几何蒙皮技术实现的骨骼动画,虽然能实现流畅的动作,但无法模拟人体软组织的运动效果,例如脂肪的抖动和碰撞引起的皮肤变形。这些软组织运动和皮肤变形,能带来更丰富更逼真的视觉效果,也是创造真实感动画的关键。
为了模拟在运动过程中虚拟角色皮肤抖动和变形的效果,在过去动画师们需要手动在关键帧处理虚拟角色的皮肤变形,虽然能达到真实的视觉效果,但过程非常繁琐耗时。所以研究人员们提出了基于物理的蒙皮方法,采用自动模拟的方式增强角色变形的真实感。传统的仿真方法主要通过3D 扫描人体结构,构建具有骨骼、肌肉和脂肪组织的多层次人体解剖模型,然后通过有限元方法(FEM)[3]对模型体积网格进行受力分析和求解。这种仿真方法符合现实中人体动力学,能模拟非常逼真的肌肉组织运动。但建模复杂且难度高,只适合人体模型的仿真运动,不适用于虚拟卡通角色。除此之外,近些年还提出了基于样本数据学习的模拟方法,例如SMPL 模型(Skinned Multi-Person Linear model)[4]能实现具有脂肪抖动物理效果的多人蒙皮动画。基于样例的方法需要输入一系列模型不同姿势的样本,然后训练学习如何通过各种姿势进行混合蒙皮。这种方法依赖大量训练姿势的样本,训练后的模型只适用于特定的骨架和皮肤网格,换一套骨架和网格可能需要重新训练。
本文提出了一种通用的分层体素框架,能实时模拟皮肤的弹性行为,如脂肪和软组织抖动等效果。给定任意的模型网格及对应静态骨骼数据,本框架可以将网格体素化后的结果分为骨骼部分和可变形的软体部分。整个角色的蒙皮动画分为两个步骤,首先使用经典的线性混合算法对骨骼部分进行初次变形,然后利用基于网格的形状匹配算法[5]将运动传递到软体部分,最终形成平滑的蒙皮。本框架主要有以下几个特点:
●可以自由调整体素模型的分层结构,改变骨骼部分和软体部分的比例。通过改变两个部分的比例可以获得不同的变形效果;
●骨骼部分的蒙皮权重不需要手动计算,通过体素网格方法可以自动获得;
●相比于传统的软体模拟方法具有更好的稳定性,且满足实时的性能需求。
1 流程概述
如图1 所示是本文的基本流程。输入是模型的网格和初始骨骼数据,首先对网格进行体素化并进行分层。根据用户指定的比例,体素被分为骨骼体素和软体体素。然后根据最短体素距离[6]可以计算骨骼体素的蒙皮权重,蒙皮权重在线性混合算法中会被用到。初始化过程结束后,输入骨骼每帧的运动数据,进入实时的动画过程。此过程主要包含两次变形,第一次是针对骨骼体素进行线性混合蒙皮[6],使骨骼体素产生初次运动。第二次变形是根据形状匹配算法[5]将骨骼层的运动平滑的传递到软体层,调整刚度系数可以改变变形的软硬程度。最后通过线性插值将体素的运动映射回原模型网格顶点,改变顶点位置,完成骨骼驱动的蒙皮动画。
图1 算法流程
2 体素初始化
本节介绍了初始化的主要两个流程,包括模型体素化分层以及骨骼体素的权重计算。
2.1 体素分层
本文采用基于GPU 的方法[7]将模型网格体素化,使得体素占据了封闭网格包含的整个空间。体素化分辨率可由用户指定。如图2 所示体素化完成后,输入初始骨骼数据(一种树形结构),进行分层操作。与骨骼线段相交的体素被默认的划分到骨骼层中。用户也可以指定一个距离h用来控制骨骼层体素的数量,与骨骼相交体素的最短曼哈顿距离为h的所有体素也属于骨骼层,剩下的体素被自动划分到软体层中。h越大,骨骼层体素的数量越多,相对的软体层的体素数量就越少。骨骼层和软体层的比例会影响最后的蒙皮效果,用户可根据不同模型采取不同的比例进行分层。
图2 模型体素化
2.2 权重计算
本文只对骨骼层体素进行蒙皮权重计算,此蒙皮权重将用于初次变形。假设骨骼树中某块骨骼为b,骨骼层某体素为i。我们定义db-i为骨骼层体素i到骨骼b的最短曼哈顿距离[6],可通过Dijkstra 算法得到。根据公式(1)和公式(2)可以计算出骨骼b对体素i的影响权重:
其中,ε是一个较小的值,可以避免公式(1)中的分母为0。α是属于0-1 的常数,用于调整距离对权重的影响。增大α的值,可以降低远处骨骼对体素的影响。在本文的实验中设为0.7 较为合适。通过以上公式可以计算每个体素受每块骨骼的影响权重,一般来说,我们选取权重最大的四块骨骼做蒙皮计算,权重之和为1。
3 实时变形
3.1 初次变形
初始化过程结束后,可对骨骼层体素进行初次变形。本文采用线性混合蒙皮算法进行此步骤。输入数据是骨骼每帧的运动数据,包含旋转和平移信息,可用变换矩阵Tb表示骨骼b的运动数据。假设骨骼体素i受四块骨骼影响,并且根据初始化步骤已经得到了影响权重w。那么在运动过程中,体素i的位置可由以下公式得到:
其中,p0b-i是体素i在初始状态时相对于骨骼b的局部位置。体素受4 块骨骼影响,乘上每块骨骼的变换矩阵就能得到四个相应的新位置,再乘上对应的权重然后相加就能得到一个平均位置。这个平均加权位置就是骨骼体素初次变形后的位置。
3.2 二次变形
初始变形结束后,骨骼层的体素根据骨骼数据的驱动已经移到了新的位置。接下来进入二次变形的步骤,二次变形不再改变骨骼体素的位置,改变的是软体层体素的位置。本文采用基于块区域的形状匹配算法,将骨骼体素的运动传递到软体体素。基于块区域的形状匹配算法的核心思想是将模型的所有体素划分为一个个重叠的块区域,当骨骼体素发生位置的变化时,对每个块区域进行一次形状匹配,估计每个块区域的运动。由于块区域是重叠的,因此骨骼体素位置的改变会引起所在块区域的变形,也会影响到重叠的其他块区域发生形变。如图3 所示是算法的示意图,当块区域中的体素发生位置变化时,运动会平滑过渡到其他块区域,使整个物体发生平滑的形变,形成软体效果。
我们首先需要为每个体素i生成一个块区域Ri,这里不区分骨骼体素和软体体素。我们定义一个距离n,块区域Ri包含了到体素i距离为n的所有体素。当n=1 时,Ri就是i以及它的一环邻居。n越大,块区域包含的体素数量就越多。由于块区域间有重叠,一个体素可能被多个块区域共享,因此体素i的质量需要除以所属的块区域的总个数,即m'i=mi/ |Ri|。每个块区域的质心可以通过以下公式得到:
图3 基于块区域的形状匹配[5]
其中,C0r是初始状态的质心,Cr是当前的质心。Mr是块区域内所有体素的总质量。xi0是体素初始位置,xi是当前位置。那么,每个块区域r的最优线性变换矩阵A为:
我们只关心A中的旋转分量。而最优旋转矩阵R可由A通过极分解获得,因此每个块区域相对于初始状态的最优线性变换T,可通过旋转矩阵和平移矩阵相乘获得,即T=R(cr-Rc0r)。那么,根据每个块区域的最优线性变换T,可以得到该区域内每个体素的移动位置为:
由于一个体素可能被多个块区域共享,因此它的最终位置是所属块区域的移动位置的平均值,即:
4 实验结果及分析
4.1 实验环境
硬件配置:Intel Core i7-3770 CPU,3.4GHz,8G 内存,NVIDIA GeForce GTX-560 显卡;开发环境:Visual Studio 2017,Blender,C++编程,OpenGL 图形开发。
4.2 实验结果
经实验证明,本文提出的方法在满足实时性能需求的同时,能得到视觉可信的软体模拟效果。如图4所示是一个胖子模型的骨骼动画截图,胖子模型的肚子会随着运动发生变形和抖动,符合预期效果。
图4 蒙皮动画结果
此外,本文还使用了不同模型分别进行了实验,测试其性能表现。经实验结果表明,模型体素化的分辨率越高,蒙皮动画的效果越真实,但相应的性能也会大幅度下降。因此体素化分辨率的选择需要在视觉效果和效率之间做权衡。复杂的模型可能需要更精细的体素化,例如人体的手指需要较小的体素来表现皮肤的变形行为。在实时的蒙皮过程中,时间消耗最大的是二次变形。因为每个体素都会生成一个块区域,每个块区域都会进行形状匹配计算,形状匹配算法中最优线性矩阵的计算通常需要迭代获得,因此比较耗时。二次变形是个串行计算过程,也是影响性能的主要瓶颈。
5 结语
本文提出一种后处理蒙皮的方法,将经典几何蒙皮和软体模拟结合在一起,把动画管线中的蒙皮过程分成了两个步骤。本文将线性混合蒙皮用于骨骼层体素,进行刚性变形。然后利用形状匹配算法将骨骼层体素的运动传递到其他层次,模拟其他层的软体运动,形成以骨骼驱动的软体变形效果。经实验表明,此方法达到了视觉可信的变形效果,且适用于实时的应用。在以后的研究中,我们会尝试加入一些几何约束来增强变形的真实性。在性能方面,我们会尝试寻找基于GPU 的实现方法来提高复杂模型动画的效率。