三维动画在OGRE中应用的研究 第4页

三维动画在OGRE中应用的研究 第4页

3 动画模块

3.1动画类(Animation)

动画的基本原理:多个关键帧组成一个动画轨迹,多个动画轨迹组成一个动画。

每个关键帧具有自己的位置、缩放比例和旋转角,同时每个关键帧还保存有自己在整个动画轨迹里所处的时间点。在各个关键帧之间通过插值算法(Spline插值或线性插值)进行插值来生成最终的动画。具体是创建一个关键帧,传入这一帧的所在的时间点。根据当前时间,得到插值计算出来的当前帧。动画模块各类之间的关系可见下图:若图片无法显示请联系QQ3249114

3.1

Ogre::Animation类间成员关系具体如下图所示:

3.2

_OgreExport Animation类枚举了两种可用的动画插值法:

  enum InterpolationMode

        {  

IM_LINEAR//线性插值法

        IM_SPLINE//样条插值法可得到平滑的转角效果。

        };

另外,也特别枚举了旋转插值模式:

enum RotationInterpolationMode

        {

            RIM_LINEAR, //线性插值法速度很快,但结果不一定正确。

            RIM_SPHERICAL//数值球状插值更为正确的,可惜代价较高。

        };

每个动画保存自己的AnimationTrack列表,保存动画名称和长度(时间)。

创建动画Animation,参数为动画名和长度(时间)

virtual Animation* createAnimation(const String& name, Real length);

创建动画状态AnimationState,参数是与动画对应的名称。

virtual AnimationState* createAnimationState(const String& animName);

3.2动画轨迹类(AnimationTrack)

我们首先看一下Ogre::AnimationTrack的协作图表

若图片无法显示请联系QQ3249114图3.3

在动画序列中轨迹是影响特定动画物体类型的关键帧序列。一个动画轨迹可以指定其控制的节点(一块骨头或场景中的一个结点)。如果骨头受动画轨迹控制,可以实现骨骼动画,如果场景节点受动画轨迹控制,可以直接实现场景节点的动画运动。通过传递参数——当前时间点、权重和是否累计权重,使当前动画轨迹对其控制的节点产生作用。每个动画轨迹保存关键帧列表、本动画轨迹所属的动画(Animation)、本动画轨迹所控制的Node,又由于动画轨迹负责关键帧的插值,所以它保存SimpleSpline(简单样条插值计算器)和RotationSpline(旋转样条插值计算器)对象以实现插值功能。

下面是 Ogre::KeyFrame协作图表若图片无法显示请联系QQ3249114

3.4

KeyFrame* createKeyFrame(Real timePos);创建一个关键帧,传入这一帧的所在的时间点。

KeyFrame getInterpolatedKeyFrame(Real timeIndex) const; 根据当前时间,得到插值计算出来的的当前帧。被这个类支持的 KeyFrame是在不连续的点及时的快照变形。这个方法能使你轻易地在这些keyframes之间插值并产生平滑的运动。参数timeIndex是相对于整个动画序列的时间,函数将返回包含插值变换的新关键帧。值得注意的是移动及缩放使用线性插值,而旋转使用球状插值会产生更自然的结果。

使当前动画轨迹对其控制的节点产生作用,参数是当前时间点、权重和是否累计权重。

void apply(Real timePos, Real weight = 1.0, bool accumulate = false);

设置关键帧间的插值方式。动画在关键帧之间缺省插值方式为线性插值,

虽然速度很快,但在方向的快速改变会看起来不自然,因为方向在关键帧处迅速改变。可供选择的另外一种方法是使用样条插值 ,它虽在计算时间上花销更大.但看起来更流畅,因为方向的主要变化是分布在 keyframes 的周围而不仅仅只在 keyframe

void setInterpolationMode(InterpolationMode im);

旋转与此类似动画在旋转之间缺省插值方式为线性插值。如果需要更为精确的插值法 , 使用球性插值法,同样的也代价很高。

void setRotationInterpolationMode(RotationInterpolationMode im);

创建一个动画轨迹。第一个参数是这个动画轨迹的唯一标识,第二个参数指定应用这个动画轨迹的节点。

AnimationTrack* createTrack(unsigned short handle, Node* node);

使当前动画对其控制的节点产生作用(委托AnimationTrack进行),参数是当前时间点、权重和是否累计权重。

void apply(Skeleton* skeleton, Real timePos, Real weight = 1.0,

                     bool accumulate = false, Real scale = 1.0f);

为给定的骨骼制定时间位置和权重等信息。如果想要将动画轨迹与节点物体联系起来,调用函数apply()就可以很容易的实现如何将动画应用于节点物体。

3.3动画状态类(AnimationState

Ogre::AnimationState的继承关系图

 若图片无法显示请联系QQ3249114

3.5

其成员关系图如下所示

3.6若图片无法显示请联系QQ3249114

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有