第三章 角色
3.1 前言
“角色”一词的源于戏剧,自1934年米德(G.H.Mead)首先运用角色的概念来说明个体在社会舞台上的身份及其行以后,角色的概念被广泛应用于社会学与心理学的研究中。社会学对角色的定义是“与社会地位相一致的社会限度的特征和期望的集合体”。角色是一个抽象的概念,不是具体的个人,它本质上反映一种社会关系,具体的个人是一定角色的扮演者。
而在我们动漫产业中,角色更是一个非常重要的元素,没有一个吸引人的角色,就出不了一个好的作品。我们本章来介绍角色的建模。
3.2 骨骼动画原理
骨骼动画(Skeletal Animation)[9]又叫Bone Animation,它与关键帧动画(Key-frame Animation)相比,占用空间小,因为它不需要像关键帧动画那样在每一帧中存储各个顶点的数据,而只需要存储骨骼变换数据,骨骼与顶点相比,当然要少得多。所以骨骼动画有很多优势,当然其技术难度也很高。骨骼动画在计算机图形学中是一个十分重要的内容,不管是在游戏、电影动画还是虚拟现实中,生动逼真的角色动画(人、动物等)会使其增色不少。
骨骼动画的实现思路是从人的身体的运动方式而来的。动画模型的身体是一个网格(Mesh)模型,网格的内部是一个骨架结构。当人物
的骨架运动时,身体就会跟着骨架一起运动。骨架是由一定数目的骨骼组成的层次结构,每一个骨骼的排列和连接关系对整个骨架的运动有很重要的影响。每一个骨骼数据都包含其自身的动画数据。和每个骨架相关联的是一个“蒙皮”(Skin)模型,它提供动画绘制所需要的几何模型信息(Vertex信息,Normal信息等)和纹理材质信息。每个顶点都有相应的一组权值(Weight),这些权值定义了骨骼的运动对有关顶点的影响因子。当把动画人物的姿势和全局运动信息作用到骨架上时,这个“蒙皮”模型就会跟随骨架一起运动。
3.2.1实时角色动画
由于骨骼动画是从另外两种实时角色动画发展演变而来,因此,为了更好的理解骨骼动画的原理,就很有必要对它们进行研究分析。角色动画是计算机动画技术的一个重要组成部分,也是计算机图形学的一个重要分支。在实时渲染环境下,主要应用于虚拟现实,视频游戏,甚至是建模软件,动画制作软件。现在,随着计算机硬件技术的发展,特别是带有硬件加速功能的显卡性能的提高,实时渲染的角色动画技术得到了较快的发展且被广泛的应用。目前,实时角色动画技术大体可分为三种类型。
图2-1关节动画组织结构图
第一类是关节动画(Joint Animation)。关节动画中的角色模型由若干相互独立的部分组成(如图2-1)。每一部分对应一个独立的网格模型,相应的对应于某一个身体关节,不同的部分按照角色的身体特征组织成一个层次结构。比如说,一个人体模型可以由头,身体,右上臂,右小臂,右手,左上臂,左小臂,左手,右大腿,右小腿,右脚,左大腿,左小腿,左脚等各部分组成。而某个部分,可能是另一个部分的子节点,同时又是另一个部分的父节点。通过改变不同关节之间的相对位移和夹角等,就可以实现所需要的各种动画效果。这类动画的优点是:
在动画的每个关键帧中只需存储关节之间的相对变化,因此动画文件需要的存储空间很小。关节动画的缺点是:在关节之间的连接处往往会有很明显的接缝,这会对模型的真实感造成严重影响。目前关节动画的应用范围主要在辅助教学领域。
第二类是关键帧动画(Key-frame Animation)也叫顶点动画(Vertex Animation)。关键帧动画中的角色模型由一系列的渐变网格构成。在动画序列的每一关键帧中记录着每个顶点的当前位置信息。通过在相邻关键帧之间插值来更新网格模型中顶点的位置就可以实现动画效果。相对于关节动画,关键帧动画不存在关节动画的接缝问题,角色也更逼真。由于顶点的位置是直接获得的,相对于关节动画其计算量也很小。但是,这类动画的灵活性很差,很难来使角色实时
的与环境进行交互。另一方面,由于关键帧中要存储所有顶点的信息,动画文件的存储空间很大。目前,关键帧动画的主要应用对象是一些顶点数目有限的角色模型,并且需要的动画简单单一,比如游戏中的小动物等,此时用不大的空间开销来换取计算时间的节省,是比较有效的方法。
第三类是骨骼动画(SkeletalAnimation)。骨骼动画可以看作是关节动画和关键帧动画的结合。他同时兼有关节动画的灵活和关键帧动画的逼真。后面将详细介绍骨骼蒙皮动画的技术细节。
3.2.2 骨骼动画简介
骨骼动画(SkeletalAnimation,又叫BoneAnimation)可以看作是关节动画和关键帧动画的结合。骨骼动画兼具了两类动画的优点又克服了它们的缺点。骨骼动画的实现思路是从人身体的运动方式而来的,它基于面模型的方法把角色建模为两层:骨架层(Skeleton layer)和皮肤层(Skin layer),与基于层次式模型方法不同,骨骼动画建
模不考虑中间的脂肪层(Fat layer)和肌肉层(Muslce layer)。
骨骼层描述了角色的骨架结构(如图2-2左),类似于关节动画中的关节,骨骼动画中的骨骼按照角色的身体特征组成一个层次结构。相邻的骨骼通过关节相连,并且可以做相对的运动。通过改变相邻骨骼间的夹角,位移,组成角色的骨骼就可以通过影响外面的皮肤层模拟出不同的动作,从而实现各种动画效果。
图2-2骨骼动画的骨骼结构图(左)和角色模型图(右)
蒙在骨骼之上的皮肤层,它是一个蒙皮(skin)模型(如图2-2右),它提供动画绘制所需要的几何模型信息,定义了角色的外观。这里的皮肤不是固定不变的刚性网格,而是可以在骨骼影响下可变形的网格。类似于关键帧中的顶点网格,每个角色模型只需要保存一个网格模型的数据;不同于关键帧动画,在动画文件中不需要在每个关键帧中保存顶点信息。
3.2.3 骨骼动画创建
骨骼动画的创建过程其实就是预处理的过程,这一过程是由美术创作者完成的,必要的时候可能会分别由3D建模工程师和3D动画工程师分别完成模型造型和动画制作工作。但也需要跟程序开发者有良好的沟通,比如模型的骨架层次定义、模型子网格划分等等。下面就对模型造型和动画制作分别予以讨论。因为本文的目的是研究骨骼动画技术,因此,本文完全没有涉及动画领域的艺术性问题。讨论美术创作者的工作也是为了便于讨论骨骼动画所涉及到的原始数据构成,以方便对骨骼动画有完整的理解。
角色模型的创建:角色静态模型一般是指骨骼动画中用来被骨骼动画参考的静态模型,它是一个单一网格模型。所有的动画将基于该静态模型创建,即动画数据中的平移旋转信息均是相对于该静态模型的。对于该网格的创建,有一些要求,比如在关节处的顶点数目应该多一些(如图2-2右)。角色骨骼层次也要对应的创建起来,并且骨骼的大小和位置关系应该与皮肤网格相适应。另外最重要的一点,还要指定网格上的顶点到骨骼的映射关系以及相应的影响权值。每块骨骼都一个影响范围,在这个范围内的顶点都要受到该骨骼的影响。每个顶点至少要受到一块骨骼的影响,但在关节处的顶点往往可能会受到多块骨骼的影响,这些骨骼通过对应的权值来叠加作用到该顶点。因此在指定权值时,一般需要有经验的动画师来实现。
动画的创建:即通过操作骨架结构的变换来构建角色动画。设置每块骨骼的运动信息,使其带动网格模型上各个顶点运动,从而形成
动画。可见,动画的创建过程就是对骨骼变换的过程。
上述两种数据的创建都可以通过专业的3D动画编辑软件如3DMAX、Maya等实现,但合适逼真的角色动画工作需要建模师和动画师有相当多的经验。
3.2.3 骨骼动画数据信息
在美术师们完成了原始数据的创建之后,一般这些数据还是以3D动画编辑软件内部的数据结构进行存储,比如3DMAX采用的.max文件结构。要使得这些数据被应用程序使用,还需要程序开发者将它们转化为适合于程序使用的数据结构。这就需要编写导出插件,用于将原始数据转化为需要的形式。例如Panda XExporter就是一个广为人知的导出插件,它可以将.max文件转换为.x文件所要求的数据格式。一般来说,每个游戏厂商都会有自己的骨骼动画引擎,相应的就需要有对应的插件来实现数据结构的转换。由于这些涉及到3D动画编辑软件内部的数据存储管理,对本文讨论的主题没有太多的意义,因此本文不会涉及这些插件技术的内部细节。为了便于后面的讨论,下面将会对转换后的骨骼动画信息进行归纳总结。
对应于原始数据,在通过插件导出之后,一般通过两种不同的文件结构分别保存角色模型数据和角色动画数据,下面分别对它们进入分析。
一、角色模型数据
由于骨骼动画的需要,在静态角色模型中,不仅仅要包含角色网
格模型信息,而且还要包含用于骨骼动画的相关信息。这些信息包括:
角色网格数据:包括所有皮肤顶点信息,每个蒙皮顶点中包含的信息至少包括:与该顶点相关联的骨骼索引组,以及每个骨骼的影响权重值组,顶点初始位置信息(注:还有可能包含其他的信息比如纹理坐标信息,顶点颜色信息,顶点法线信息等等,但本文在此只关注骨骼顶点相关的信息)。由于是单一网格模型,对每个顶点来说,对应的信息只需保存一次。
模型索引数据:索引数据主要是用来保存顶点之间的连接关系,每三个顶点构成一个三角形面,而三角形面即是用于渲染的基本图元,索引数据每三个为一组记录的这种三角面关系。
骨骼层次信息:每个角色都有一个骨架层次结构,一般是树形结构。对所有的骨骼要有一个统一的编号,每块骨骼都要记录其父骨骼。
二、角色动画数据
从动画师的角度看,动画就是可视化的骨骼变换操作。从程序开发者的角度来看,每个动画文件中要保存的信息如下:
1、每块骨骼的关键帧编号。对于一块骨骼而言,它的变换信息是通过关键帧的形式保存的,比如需要在第一、三、七、十帧中记录一块骨骼的变换信息,那么第一、三、七、十帧就是需要保存的关键帧。
2、每个关键帧的变换信息。对于一块特定骨骼的特定关键帧来说,需要记录其变换信息,一般是通过矩阵记录的。
3.2.3 骨骼动画的载入
1.先来看看静态模型的载入。
由上文的论述可知,静态模型的载入过程实际上是对网格数据、索引数据以
及骨架层次三类信息的载入过程。如何对这三个信息予以管理以便于骨骼动画的实现是骨骼动画实现的基础,因为骨骼动画的驱动过程就是依靠这些结构来实现的,下面将对它们分别予以分析。
1、网格数据的载入和管理
对于单个顶点来说,可能需要保持的信息是相当多的,比如纹理坐标信息,颜色信息,顶点信息等等,这用于渲染的顶点信息是对称的,即每个顶点所需要的存储空间是一样的。
此外,为了实现骨骼动画算法,顶点需要保持与骨骼动画相关的信息,如与该顶点相关联的骨骼索引组,以及每个骨骼的影响权值组等等。值得一提的是,并不是所有皮肤顶点所关联的骨骼数目都是统一的,比如在关节处的顶点所关联的骨骼数肯定要多于非关节处顶点所关联的骨骼数目。
因此可以通过两个不同的顶点结构来保存两者。这样做的好处在于,用于渲染的顶点结构,它直接记录了渲染所需要的信息;而用于骨骼动画计算的顶点信息,它包含了骨骼动画实时运算所需要的顶点数据。
2、索引数据的载入和管理
索引数据主要是用来保存顶点之间的连接关系,每三个顶点构成