您的位置: turnitin查重官网> 计算机 >> 计算机安全 >探究蒙皮基于XNA人体骨骼蒙皮动画关键技术查抄袭率

探究蒙皮基于XNA人体骨骼蒙皮动画关键技术查抄袭率

收藏本文 2024-01-23 点赞:5998 浏览:16026 作者:网友投稿原创标记本站原创

摘 要: 人体骨骼蒙皮动画技术是计算机动画领域研究的热点和难点。针对当前骨骼蒙皮动画中关节断裂、皮肤塌陷、顶点计算量大、执行效率低等问题,首先分析了其原理及实现过程,然后以Visual Studio 2012+XNA4.0为平台,设计实现了一个骨骼蒙皮动画的引擎框架,并采用优化旋转算法、动画混合、GPU更新顶点等关键技术,提高了动画的执行效率,增强了动画的真实感。
关键词: 骨骼蒙皮动画; XNA; GPU; 动画混合
1006-8228(2013)03-13-04
0 引言
计算机动画技术已被广泛应用到电影、游戏、军事、航空等领域,它的研究对象包括现实生活或虚拟世界中的云雾雨、河流、各种植物、动

源于:论文提纲格式范文www.udooo.com

物等等,但其中最有难度和最有挑战性的对象之一就是人体动画。人体运动非常复杂,人的形状不规则,肌肉随着人体的运动而变形,头发、皮肤和衣服模拟起来很困难。另外,由于人类对自身的运动非常熟悉,不协调的运动很容易被观察者所察觉。人体的行为通常包括细微行为(如表情变化)、局部行为(如闭眼、手势等)和全身行为(如走、跳、跑等)。本文在分析骨骼蒙皮动画原理的基础上,利用XNA4.0较好地实现了人体骨骼蒙皮动画,并采用多种关键技术对动画进行优化。

1 骨骼蒙皮动画原理

目前实时人体动画技术可分为三类:关键帧动画、关节动画和骨骼蒙皮动画。
关键帧动画需要首先存储每一帧动画的网格模型,实质上是一种以空间换时间的动画技术。它的优点是计算量小,速度快,角色也更逼真。如果场景中有几百个动画模型共享相同的动画,这种方法将很有用。但是它的局限性也很明显,首先是占用空间较大,其次是灵活性差,很难与用户进行交互,所以关键帧动画一般用于简单的连续动作的模拟。XNA中使用关键帧动画模型很简单,因为XNA有处理静态模型的类。
关节动画是基于面模型的建模方法中的一种,它将骨架层(Skeleton layer)(如图1左)和皮肤层(Skin layer)(如图1右)进行刚性连接,动画过程中,通过骨架运动带动相应的皮肤顶点运动。在该方法中,皮肤相对于与之相连的骨骼并没有发生运动,所以只需要用矩阵描述各个骨骼的相对于父骨骼运动,不考虑皮肤的弹性变形,实现简单,计算速度比关键帧动画慢。但由于是刚性连接,在两段骨骼交接处,容易产生裂缝,影响效果。所以关节动画适合对皮肤精度要求不高的场合,如模拟机器人行为。
骨骼蒙皮动画可以看作是关键帧动画和关节动画的组合,是目前比较流行的动画技术。它在关节动画的基础上,利用顶点混合(Vertex Blend)技术,改变皮肤层顶点的数据结构,使其存储影响这些顶点位置的骨骼信息及影响的权值,然后通过“蒙皮”算法得到顶点的最终位置。使用“蒙皮”算法相当于在骨骼关节上动态蒙皮,有效解决了裂缝问题。但由于“蒙皮”算法中权值的指定是由人工完成,而且在较大关节部分(如肩膀)权值的指定很困难,容易出现如“塌陷(collapse)”、“裹糖纸( candy wrapper)”效应等变形问题。文献[3]中,夏开建等提出了一种改进的“蒙皮”算法,使用向皮肤可变区域中增加辅助节点的方法很好地改善了变形问题,本文将按此改进的“蒙皮”算法进行皮肤顶点位置的计算。

2 基于XNA的骨骼蒙皮动画的设计

2.1 动画模型的创建

骨骼蒙皮动画的创建一般分为模型的创建和动画的创建,逼真的动画模型需要由具有丰富经验的建模师和动画师通过专业的3D软件如3DMAX、Maya等实现。模型中还需要存储相关数据信息:
2.

1.1 模型数据

静态的模型包括骨骼层以及包围它的皮肤层。模型中需要存储用于骨骼蒙皮动画的相关信息,主要包括骨骼的层次结构和皮肤的顶点信息。骨骼的层次结构是指按照角色的身体特征构成一个层次结构。图2给出了人体骨骼的层次结构,箭头由父骨骼指向子骨骼,从子骨骼用矩阵乘法累积到最顶层的根骨骼,就可求得每个子骨骼相对于世界坐标系的变换矩阵。皮肤的顶点信息包括顶点的索引、与顶点关联的骨骼索引及权值、顶点的颜色、顶点的法向量等。
2.

1.2 动画数据

从程序员的角度来看,动画数据就是动画过程中的骨骼关键帧以及变换矩阵,由它们来决定模型的运动。在XNA中,可以将动画的变换矩阵存放在模型内部,但是对于动画比较复杂的模型,一般存储在单独的animation文件中,这样便于对模型进行驱动和人机交互,以及进行动画混合。

2.2 数据的载入

在使用XNA进行游戏编程时,首先要将3D软件创建的动画模型文件(X格式或FBX格式)转换成XNB格式,才能被XNA的内容读取器(Content Reader)读取。在XNA中,程序员使用内容管道(Content Pipeline)来加载硬盘上的资源[4](如3D模型、2D图像、声音等)。这个过程分为两步:当项目被编译时,内容管线从硬盘读取资源,将它处理成二进制文件存放在硬盘上;当游戏运行时,直接从二进制文件中读取数据。这样做的好处在于:大量的计算在游戏运行之前处理完毕,可提高游戏运行速度;同时,先前存储的二进制数据可以被PC、Xbox 360、Zune和Windows Phone读取,从而实现了跨平台。
虽然XNA的内容管道可以很方便地进行资源的加载,但它并不完全支持骨骼蒙皮动画,因为它可以导入带有骨骼蒙皮动画数据的X文件或FBX文件,但输出时并不处理所有的骨骼蒙皮动画数据。要在XNA中添加对骨骼蒙皮动画的支持,程序员需要扩展默认的模型处理器(model processor),创建一个新的处理过程并存储模型的骨骼和动画数据。图3显示了扩展内容管道所需创建的类,添加了对骨骼蒙皮动画模型的支持,新增加的类使用灰色字体和黑框标识。除此以外,还需要创建新的类存储、写入和读取这些数据。

2.3 骨骼蒙皮动画的更新

在游戏的运行过程中,角色需要时刻准备与用户进行交互,完成相应的动画,这也是实时动画技术的一个必备功能。从程序员的角度来说,就是根据用户的输入实时更新角色的状态。

2.3.1 骨骼信息的更新

首先根据动画的播放时间确定该动画在该时刻的两个插值关键帧,然后按照播放时间对这两个关键帧进行插值,从而确定每一块骨骼该时刻在局部坐标系下的变换矩阵(平移和旋转信息),最后与父骨骼在世界坐标系下的变换矩阵相乘便得到了每一块骨骼的在世界坐标系下的变换信息[5]。在插值过程中,平移过程可使用普通的线性插值完成,而旋转过程则通过四元数的球面线性插值来实现。

2.3.2 皮肤顶点信息的更新

对于皮肤顶点,根据每个顶点所关联的骨骼以及对应的权值,使用“蒙皮”算法计算皮肤顶点的位置。“蒙皮”算法本质上是一种插值算法,它的基本思想是使关节处的皮肤顶点受到与之邻近的几段骨骼的影响,影响大小由权值确定。其公式如下:
其中,vd是初始状态的皮肤顶点在世界坐标系中的坐标;Di表示在初始状态下第i段骨骼由局部坐标系到世界坐标系的变换矩阵;表示皮肤顶点在第i段骨骼局部坐标系中的坐标值;Mi表示第i段骨骼在当前位置由局部坐标系到世界坐标系的变换矩阵。ωi表示第i段骨骼对于当前顶点的权值,v表示变形后的皮肤顶点在世界坐标系中的坐标。

2.4 骨骼蒙皮动画的优化

2.4.1 旋转算法的优化

旋转是骨骼蒙皮动画最基本的操作,因此旋转算法的优劣与动画的最终效果密切相关。传统的XNA编程通常使用欧拉角表示旋转,需要三个浮点数分别表示绕三个坐标轴的旋转。本文使用四元数表示旋转,四元数需要4个浮点数,虽然比欧拉角多使用一个浮点数导致耗费的内存增加,但四元数可以避免使用欧拉角带来的抖动和万向节锁的缺陷。不仅如此,四元数还可以根据动画的逝去时间(elapseTime)和动画长度(animLength)对前后两个关键帧进行球面线性插值,从而求得该时刻的变换矩阵。球面线性插值公式如下:
其中p,q是源和目标四元数;t是取值为0和1之间的插值参数;θ是两个四元数之间的实际角度。

2.4.2 动画混合

动画混合就是利用两个或多个已有动画序列进行混合从而生成一个新动画,如把走路和挥手相结合,就形成了走路挥手的动画。这种技术在生成新动画的同时,还节省了动画载入的时间以及动画存储的内存开销,而且减轻了动画师制作动画的工作量。
本文在动画设计过程中已将动画分为两部分:上半身动画和下半

摘自:毕业论文工作总结www.udooo.com

身动画,在角色实际运动过程中可根据与用户或与环境的交互来进行不同动画效果的组合。上半身动画主要是手部动画,包括:走、跑、蹲、挥手、拔、射击、死亡等;下半身动画主要是腿部动画,包括:走、跑、蹲、死亡等。最基本的动画混合就是将上、下半身动画进行组合生成多种新的动画,这一类混合动画的驱动方式与骨骼蒙皮动画驱动方式相似,不过,要在更新时同时计算出上、下半身骨骼的变换矩阵。另一类动画混合是两种动作的过渡,如人在跑动过程中拔射击或是跑动过程中中弹死亡,这些都需要在各个动画之间进行无缝衔接。在实现中,需要在动画变化的瞬间冻结前一个动画,并获得当前关键帧,然后与下一个动画的第一个关键帧进行差值,从而实现平滑过渡[7]。

2.4.3 GPU编程更新顶点

在可编程图形处理器出现之前,骨骼蒙皮动画中大量的计算都是由CPU来完成的。但随着图形硬件性能的提高,尤其是GPU中使用顶点渲染器和像素渲染器,以及现在的流处理器,使得GPU的综合运算能力得到了很大的提高,而其特有的向量运算和矩阵运算能力更是超越了CPU[6]。因此,可以充分发挥GPU的运算特点,分担CPU在运算上的压力。
GPU主要是针对图形渲染的特点设计的,在GPU内部存在顶点渲染、光栅化、像素渲染这样的流水线,但在顶点之间、像素之间是没有任何关联性和依赖性的。因此GPU适合做大规模的并行运算,而不适合用来做逻辑性和复杂性很高的算法运算,其运算结果也不会被保存下来供下次运算使用。因此,要将骨骼蒙皮动画的某些运算交给 GPU来执行,这些运算必须保持算法简单,且适用于大量数据。通过分析2.3节中骨骼蒙皮动画所涉及到的运算可以发现:骨骼信息的更新涉及插值运算、递归运算、矩阵运算,其运算结果还需保留以便进行顶点信息的更新,所以骨骼信息的更新不能使用GPU进行计算;而顶点信息的更新针对的是每个顶点,顶点与顶点之间不存在依赖关系,仅仅利用与其关联的骨骼和骨骼影响权值,使用骨骼的全局变换矩阵进行顶点数据的更新,更新结果无需保留而是直接显示在屏幕上。可见,该过程非常适合于在GPU中进行处理[8]。这样,就可以使用CPU更新骨骼信息,GPU更新顶点信息,二者协同完成骨骼蒙皮动画的更新。

3 基于XNA的骨骼蒙皮动画的实现

本文使用Visual Studio 2012+XNA4.0进行骨骼蒙皮动画的实现。综合以上对骨骼蒙皮动画的分析与设计,下面将对其进行实现。程序结构设计图如图4所示,程序的实现分为模型和动画的创建、数据载入、数据读出和数据更新四个部分。在数据更新部分,对骨骼信息的更新在CPU中进行,将CPU中计算得到的骨骼在世界坐标系中的变换矩阵以及顶点与骨骼的关联信息传入GPU中,在GPU部分使用HLSL进行顶点的更新并输出到屏幕。图5为程序实现的主要类图:KeyFrameSequence类用于获取动画序列的关键帧并进行插值运算;GameAnimateModel类用于矩阵转换、动画混合、动画播放等;GamePlayer类用于与用户进行交互;Game1类为XNA中程序的主类,是程序运行的入口。

4 结束语

本文从骨骼蒙皮动画的原理出发,以XNA为开发平台,设计并实现了骨骼蒙皮动画。在实现过程中对动画的旋转算法进行了优化;使用动画混合技术实现了人物各个动作的无缝衔接;将顶点更新及渲染交给GPU来完成。这些措施提高了动画的执行效率,增强了动画的真实感。随着3D技术的发展,骨骼蒙皮动画技术以其优良的执行效率及较为逼真的动画效果,成为了实时动画领域最受欢迎的技术之一。如何实现更加逼真的动画混合,怎样协调CPU与GPU的利用率,必将成为下一步研究的热点。
参考文献:
AUBEL A. Anatomically-based human body deformations[D].
Université de Marne-la-Vallée,France,2002.
吴小,马利庄,顾宝军.计算机动画中人体建模与皮肤变形技术的研
究现状与展望[J].中国图象图形学报,2008.12(4):65-73
[3] 夏开建,王士同.改进的骨骼蒙皮算法模拟皮肤变形[J].计算机应用
与软件,2009.26(12):174-176
[4] Alexandre Santos Lob?o A.Beginning XNA

3.0 Game Program-

ming From Novice to Professional[M].Apress,2009:305-319
[5] 袁会杰.骨骼动画技术的研究与实现[D].电子科技大学,2010.
[6] 陈军.复杂三维场景的数据处理及骨骼动画实现[D].浙江大学,2008.
[7] 雷涛,罗维薇,王毅.一种具有逼真效果的虚拟人动画生成方法[J].计
算机应用研究,201

2.29(10):35-37

[8] Method in Real-time Skeletal Character Animation[J].International
Journal of Virtual Reality,2011.10(3):25

copyright 2003-2024 Copyright©2020 Powered by 网络信息技术有限公司 备案号: 粤2017400971号