三维动画在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的继承关系图
图3.5
其成员关系图如下所示
图3.6若图片无法显示请联系QQ3249114
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>