11.1 动画类型
虽然游戏场景主要是用静止物体构成,但对于玩家和NPC仍需用到动画模型。你可以使用不同的方法实现动画。例如,在赛车游戏中当汽车前进是轮子是滚动的,你可以通过让轮子绕着自身轴旋转实现动画,但当你要要游戏角色动起来时(跑、跳、下落等),动画的处理过程将变得非常复杂,因为你需要改变模型的网格。图11-1显示了一个角色走动的动画序列。
图11-1:在这个走动动画中,模型的网格在每帧都有变化。
图11-1中的动画是由5个不同帧(或称为关键帧)组成的,每个帧表示角色的不同动作。每帧还包含时间信息,这个时间信息定义了动作何时要改变。最后,要让动画循环,第一帧和最后一帧应是相同的或头尾连接。
主要有两种动画:关键帧动画和骨骼动画。这两种动画适用场合不同,各有优缺点。
关键帧动画(keyframed animation)
在关键帧动画中,你存储了动画每帧的模型网格。如果你想实现如图11-1中的动画,你需要导出四个不同的静态网格并在每一帧改变网格。这种动画叫做关键帧动画,因为只导出动画的关键帧。例如,在图11-1的动画中,你可以在第一帧和第二帧之间拥有很多过渡帧,使动画更加平滑。但没必要导出这些过渡帧,因为你可以通过在第一帧和第二帧之间插值得到。例如,在线性插值中,每个顶点的位置都是第一帧和第二帧之间的线性插值。
关键帧动画的优点是它很快,因为无需计算。所以动画帧都存储在内存中,在动画中你只需改变模型就可以了。另一个优点是无需在内存中存储所有的模型网格,这样它们绘制起来很快。如果一个模型有几百个动画帧,存储几百次网格是必要的。但如果场景中有几百个动画模型,而它们都共享同样的动画,那么关键帧方法就很有用了。XNA中使用关键帧动画模型很简单,因为XNA有处理静态模型的类。这样,例如使用Model类,你可以将一个关键帧动画模型作为静态模型的数组处理。
骨骼动画(Skeletal Animation)
另一种是模型动起来的方法是骨骼动画。在这种方法中,你需要为模型创建一个由一些bone组成的骨骼,并将网格上的每个顶点连接到骨骼的bone上。这样,当骨骼运动时,骨骼上连接的网格也跟着一起运动。
要制作模型网格,骨骼和动画,你可以使用不同的支持骨骼 (或bone)动画的建模工具,例如3ds Max、 Maya、Blender等。在XNA内置支持的模型格式中,X (DirectX文件)和FBX (Autodesk)都支持骨骼动画。注意骨骼也有关键帧,这意味着只有骨骼动画的关键帧可以输出。图11-2展示了一个带有网格和骨骼的模型。
图11-2. 带有网格和骨骼的模型
比起关键帧动画,骨骼动画有很多优点。它可以使动画更容易混合,让你可以同时将不同的动画作用在一个模型上。例如,你可以对图11-2中的模型设置两个动画,一个动画使它走动,一个动画使它四面观察(转动脖子)。骨骼动画还允许一个物体的bone连接到另一个物体的bone上。例如,你的角色拿着一把剑,你可以将剑的bone连接到角色手的bone上,这样能使剑随着手一起移动。当前,骨骼动画使用得比关键帧动画更广泛。
XNA内置不支持骨骼动画。虽然XNA的素材管道可以导入带有骨骼动画的模型,但默认的模型处理器(model processor)只处理模型的网格和骨骼而忽略动画。此外,模型的骨骼输出也可能不符合实际需要或未经优化。
表示骨骼和Bone
在我们详细讨论XNA中的骨骼动画原理之前,你必须首先理解骨骼模型是如何构成的和如何表示和存储bone。
有两种不同的方式存储模型骨骼。一种使用bone一种使用关节(joint)。比如,3ds Max使用bone表示骨骼,而Maya使用关节表示骨骼。因为模型导出为XNA可用的格式(X或FBX),所以两者没什么不同。本章中你将是用bone表示和存储骨骼,每个bone有其初始位置和朝向,每个bone的大小定义为它的位置和子bone位置间的距离。必须要有一个终结bone(大小为0)定义骨骼的末端。
bone的朝向的位置和位置定义了它的配置(configuration),图11-3展示了使用bone表示一个手臂骨骼。注意必须在HandBone之后有一个End Bone定义HandBone的大小和表示手臂骨骼的终结。
每个bone的位置和朝向与它的父(ancestor)相联系。例如,hand的朝向和位置是由forearm定义的,而forearm又是由upper arm定义的,重复上述过程直到到达root bone。根据这个概念,你可以明白改变任何bone都会影响它所有的下层bone。如果left shoulder bone发生移动,那么所有的bone都会移动。
要存储骨骼,你需要存储每个bone的配置(位置和朝向)和这些bone的层次结构(hierarchy)。层次结构用来计算bone的配置(configuration)。你可以将配置存储在一个矩阵中,骨骼层次结构作为一个指向每个bone的父(ancestor)的引用集合。
图11-3:骨骼的手臂bone。层次结构开始于Root Bone终止于End Bone,每个bone都是上层bone的后代(descendent)。所有bone开始位置都用一个方块表示,终止与下一个bone的开始位置(下一个方块表示)
发布时间:2009/4/24 下午4:05:47 阅读次数:9956