【Ogre编程入门与进阶】第九章 动画

本文深入探讨Ogre中的动画系统,包括动画基础、骨骼动画、顶点动画及其混合,以及场景节点和数据动画。通过示例展示如何在Ogre中创建和融合多个动画,帮助读者理解Ogre动画机制。
摘要由CSDN通过智能技术生成

9.1 动画基础

        动画是基于人的视觉原理创建的运动图像。人的眼睛通过视觉暂留效应,当对上一个画面的感知还未消失时,下一张画面又出现,这样就会有动的感觉。计算机图形学中的动画也同样遵循着这一原理。在三维软件中创建动画,需要为每个动画序列设置起始帧、结束帧和关键帧,中间帧由软件自身计算完成。

        Ogre本身不会对对象的速度、加速度进行跟踪,不能像人一样了解场景中动画角色动作的具体含义,例如它不知道什么是走路或者叉腰。Ogre能做的就是从数学的角度,逐帧的处理场景中对象的移动或者变形。每一帧,在ogre动画系统的控制下,根据任意变量的函数来定位与定量决定,同时进行场景的重绘。这样,在每秒24帧的动画中,同一个角色在一秒中画24个,每一个稍有不同,在一秒内连续播放,ogre就会通过其动画系统形成连续的动画场景。

9.2 Ogre所支持的动画类型

        一个成熟的绘制引擎少不了对动画的支持。从某种抽象层次上来讲,Ogre的动画可以理解为一系列运动轨迹的集合。其中的每一个动画轨迹都可以被用来存储一些动画数据,存储动画数据是利用了“时间函数”的方式,存储的数据包括输入时间参数等等。在动画中最重要的概念莫过于“关键帧”,关键帧的定义是:在某一个特定的时间点,对场景中的某一个物体位置、方向等状态的采样,对应到前面讲到的时间函数的概念,关键帧由所有轨迹数据的值组成。继续延伸下去,关键帧动画就是一种基于关键帧概念的动画类型,展开讲关键帧动画会将整个动画轨迹的时间轴划分为若干个不同的时间点,每个时间点就是一个对场景中的物体运动状态的采样,而且时间轴上的其他时间点(非关键帧点)可以利用特定的差值方法计算得到,从而使最终的动画效果比较流畅。

        关键帧可以有多种类型,比如骨骼、数字、节点、顶点等,基于这些不同的动画类型,Ogre系统中也支持多种的关键帧动画类型,它们分别是数字动画轨迹(NumericAnimationTrack)、节点动画轨迹(NodeAnimationTrack)和顶点动画轨迹等,下面我们就简单向读者介绍一下这几种类型:

 

9.2.1骨骼动画

        骨骼动画(SkeletalAnimation)又叫Bone Animation,最常用的动画类型。顾名思义,一个骨骼动画模型,其上面的顶点被绑定在有多块“骨头”组成的“骨骼”上,看上去像是在模拟人类的运动。当然,在动画中并不存在所谓的“骨头”或“骨骼”,它们不过是我们利用3Ds max或Maya等三位建模软件建立好的“实体”。数据与骨骼的绑定,这就好像身体上的肌肉附生在骨骼上一样关键帧动画需要存储每一帧的各个顶点的数据,而骨骼动画只需要存储每一帧的骨骼运动的数据,并根据网格数据中的骨骼信息来产生动画效果,骨骼要比顶点少得多,因此骨骼动画能用非常小的数据量实现类似关键帧动画的效果。

        与身体里的骨骼不同的是,在动画中并没有真实存在的骨头,它们被定义为移动、旋转和缩放这种“无实体”的空间变换。取而代之的是空间变换数据(正确的说,应该被称为“矩阵调色(Matrix Palette)”),骨骼动画就是通过这个表示骨头的矩阵来影响所绑定顶点的位置从而实现动画效果。在OGRE中.骨骼被定义为一个类似多叉树一样的父子结构。一个骨骼中所有的骨头都会有连接到上一级骨头,如同树枝一样,最终连接到根部,称之为根骨头。这种由骨头组成的层次结构称为骨架。每一块骨头都包含其自身的动画关键帧数据,根骨头没有父节点;骨头的运动会传递到所有下一级的骨头.然后依次传递,由此驱动骨架运动,。在空间变换的领域中,骨骼中的骨头和场景中的节点有着相同的情况:改变任何一个骨头都会影响所有子骨头的状态。

        与关键帧动画相比,使用骨髂动画有很多优点。首先,骨髂动画需要保存的动作数据量非常小。其次,通过指定不同的权重,可以很容易的将多个动作绑定在一起形成新的动作。还可以实现动作间的平滑过渡等等。

 

9.2.2顶点动画

        与通过计算动画骨骼,再根据骨骼位置计算顶点位置的动画方式不同。顶点动画是直接使用顶点让网格(mesh)产生动画的一种方式。每一组动作在顶点动画中对应一个顶点数据实体,对每个动画位置都要传送完整的顶点数据的拷贝。顶点动画被存储在.mesh文件中。有时这种方式是解决问题的唯一办法,例如让人脸模型产生面部表情及发音动画,实现逼真的面部表情动画。顶点动画分为两种子类型:变形动画和姿态动画。
   

9.2.2.1变形动画(MorphAnimation)

        变形动画是两种顶点动画技术中最简单最直观的一种。变形动画依靠在每个关键帧中及关键帧之间保存和插入表示顶点绝对位置的快照(snapshot)来生成动画。这种方法比较消耗资源,但是计算效率最高。因此,变形动画常常被用来制作场景中人物模型的肢体动作等,而人物模型表情的变化等较为细腻的动画类型应该交由下一小节“姿态”动画来实现。

        但是正是因为顶点绝对位置数据的使用,不可能在同样的顶点数据中混合多于一个的变形动画;如果想使用动画混合,则可以使用骨骼动画。当然,如果有两个动画,它们影响的顶点没有交集,那么也可以对这两个动画进行混合,不过最好避免这种情况出现。不过变形动画与骨骼动画能够组合应用。

 

9.2.2.2姿态动画(PoseAnimation)

        姿态动画可以用来模拟非常精细的动画,因此在3D游戏或动画的开发中,姿态动画常常被应用于人物模型的面部动画中,如:可以将姿态动画应用到人物角色的眼睛、眉毛、口型的变化等较为细腻的动画类型中来。

        为了产生姿态动画,需要引用预先包含在mesh中的一套动作集,而动作集中保存的顶点的位置是相对于复原位置的偏移量,是顶点的相对位置而不是绝对位置。而且也不要求每一个顶点都有偏移量,只有变化的顶点数据才被保存,没有偏移量的顶点在处理时会被自动忽略掉。因此,姿势动画不仅更灵活,而且对资源使用也更高效。

        一旦定义好了姿态,我们就可以在动画中引用他们。与变形动画不同的是,姿态动画允许将多个姿态混合成最终的顶点状态,模型的各种姿势被保存在动画轨迹中,这些姿势可以被混合来创建更复杂的动画。例如在制作面部表情动画时,姿势动画中每一个面部表情都可以被作为一个独立的动画,我们可以同时将一个表情混合在另外一个表情上,生成更为复杂的表情,如果每个姿态只影响面部的一部分,也可以组合所有的表情。当姿势动画的关键帧引用一个或多个姿势动画时,关键帧就会指定一个或多个姿态轨迹,每个姿态的引用都对其最终姿态有一个影响权重。权重决定了当姿势被混合时每个顶点偏移对最终的顶点位置产生多大的影响。不用每一帧都进行姿势混合,我们可以通过定义许多关键帧,使用多种姿态的混合,从而产生多个部位协调运动的动画。

 

笔者注:

        要十分小心多个姿态同时应用的状况,混合姿态数量的增加会消耗更多地执行时间来激活混合的姿态,因此在使用姿态动画时候有一些经验上的限制。例如在这个关键帧中混合了姿态1和姿态2,而在下一个关键帧中混合了姿态3和姿态4,那么在两个关键帧之间过渡的过程中就会执行4个活动轨迹,需要激活4个活动轨迹,而不是一般认为的2个。

 

 

9.2.4骨骼动画与顶点动画的混合

        在Ogre中,我们可以通过混合多种类型的动画来创建更复杂的动画效果。但是变形动画不能与姿态动画进行混合,也不能混合多个变形动画,这是由顶点动画的产生原因而决定的,这点要特别注意。

        当把顶点动画与骨骼动画混合的时候,Ogre会首先计算顶点动画的结果,然后在应用骨骼进行空间变换到最终位置,即那些在顶点上的效果会首先被应用到模型上,而后骨骼动画被应用到这个结果上。举例来说:可以对动画角色的复杂面部表情用顶点姿态动画进行控制,同时用骨骼动画控制整个角色身体动作的移动动画(包括头部模型)。

        通过把变形动画和骨骼动画混合,可以给骨骼动画角色增加一种变形网格的效果。例如,有时我们希望动画角色的衣服能够跟随实际骨骼动画的运动而发生变化,这时候就可以将衣服动画与角色的骨骼运动动画进行混合,通过骨骼动画控制角色本身的运动,而“外层”的衣服动画则可以交给变形动画进行处理,这样就可以很好的避免对衣服动画进行耗时的实时模拟计算。

        到目前为止,我们介绍的这些动画类型都可以在CPU中通过软件的方式执行,并且在默认的情况下就是这种执行方式。但是对于复杂的角色,通过硬件上面的顶点着色程序来实现硬件蒙皮是一个非常有用的想法。

 

笔者注:

        需要格外注意的一点是:硬件动画中的模型数据不能被CPU 使用。当我们需要对动画模型进行某些计算的时候,如果将顶点变换的计算工作交给GPU来执行的时候,你后面的代码就无法得到这些顶点的数据了。当我们在CPU中需要再次应用这些数据时,就需要在CPU中再次执行与GPU中相同的顶点变换计算。可以通过Entity::addSoftwareAnimat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值