参考:http://blog.csdn.net/leonwei/article/details/5819248

http://blog.csdn.net/debugconsole/article/details/32721901

在Ogre中Animation是一块非常重要的部分,但是笔者在学习Ogre的动画时遗憾的发现关于Ogre中动画的资料非常的少,Ogre的sample中只有最简单的导入一个骨骼动画的例子,在网上也很少有人谈及,Ogre Wiki中的教程也是边边角角,不知这么重要的部分为什么不做一个全面的tutorial。我从网上的仅有的一些资料和自己的亲自试验总结了一下基本的Ogre动画的使用,当然Ogre的动画模块非常庞大,我总结的只是冰山一角,但是也是最常用的部分。

这其中最底层的类叫做Keyframe类,它表示某一个可驱动物的(一个结点、一根骨头、一个顶点。。)的某一个关键帧的状态(位置、缩放、朝向等)和对应的时间点,这样一个可驱动点可以有多个关键帧keyframe。

一个可驱动点的所有keyframe组合成一个track,每个可驱动点都有一个他的track,这就好比某个点在整段动画中的轨迹,其中keyframe要由track来创建

多个track组合在一起就成为了一段动画,用Animation类来表示,这就是一个动画,例如对于骨骼动画,他的每一个骨头都有一个track,那么所有的骨头的track的组合在一起也就是整个骨骼动画了。track由Animation来创建。Animation则可以通过skeleton或者scenenmanager等来创建。

AnimationSate类:通常我们操控一段动画的播放等都不是直接操纵animation类,而是通过一个类AnimationState,它是animation的一个实例,通过场景管理器创建某个animation的一个animationState,然后就可以利用这个animationstate来播放这个animation了。

动画种类

Ogre中的动画主要有skeleton animation、vertex animation、node aniamtion、数值动画这几大类

这其中骨骼动画我们最为常用,后面将着重分析,顶点动画大多情况下利用gpu shader来实现以提高效率,所以较少直接使用ogre的动画机制,这里就不分析了,下面主要总结一下node animation和骨骼动画。

但是无论是这里面的哪一种动画,实现的机制都是上面的图绘制的那样的,只是在不同的动画里面使用了图标类中的不同的派生类,调用了不同的函数。

node Animation

结点动画是指让场景中的某些结点运动,如创建camera的动画等。步骤是这样的:

1首先使用sceneManager来创建一个animation,这里面同时指定动画的名字和长度:

Animation* anim=smgr->createAnimation();

2设置该段动画的关键帧间帧的插值方式,Ogre主要提供两种插值方式:线性的和样条线的,样条线的更加平滑,绘制的是弧线:

anim->setInterpolationMode(Animation::IM_SPLINE);

3.使用animation创建为每个要驱动的node创建一个track,比如这里我们只想让一个结点(node,比如它上面挂着摄像机)运动,就只为他创建一个track就行了,第一个参数是这个track的编号

NodeAnimationTrack* t0=anim->createNodeTrack(0,node);

4、对于每个track创建它的每个关键帧:

这里比如我们打算只在首尾设置两个关键帧

TransformKeyFrame* k_t0_0=t0->createNodeKeyFrame(0);//设置该帧的时间点 
k_t0_0->setTranslate(Ogre::Vector3(0,0,0));//设置该帧处这个结点的位置和其他几何状态 
TransformKeyFrame* k_t0_1=t0->createNodeKeyFrame(1); 
k_t0_1->setTranslate(Ogre::Vector3(100,0,0));

5至此这段结点动画就算编完了,下面你需要为他创建一个实例,才能播放,也就是创建一个AnimationState: 
AnimationState* as=smgr->createAnimationState(该动画名字);

6最后便是利用这个as来操纵动画了,方面在下面

操纵动画播放

使用AnimationState可以操纵动画,默认情况下一个AnimationState是设置为不能播放状态的,所以要想播放要先调用AnimationState的setEnabled来开启这个动画,这时它默认处于时间轴的开端状态,然后调用它的setTimePosition()函数来转到某一个时间点的状态,这个函数你通常写在帧监听中,逐帧进行增加来播放动画。

骨骼动画

骨骼动画的基础:在ogre中骨骼动画主要涉及两个类,mesh和skeleton,skeleton由许多Bone组成,这些bone之间有层级关系,skeleton就是一个骨架关系,某个mesh可以被绑定在这个skeleton上,绑定的实质就是某个vertex受某些bone的影响,也就是某个bone运动,就会导致和他有关系的那些vertex运动。所以对照本页最上面的图,他最末端控制的店就是skeleton中的每个bone,一个skeleton中可以蕴含多套animation。

最常用的使用骨骼动画的方式是这样的,在ogre中,美工在3d创作软件中建立模型,并绑定骨架,然后创建骨骼动画,最后用ogre的插件导出,导出的文件包括一个mesh文件和一个skeleton文件,但是这个mesh文件中自动的关联了这个skeleton文件。程序员在导入一个mesh到一个entity上时,就等于自动的导入了这个骨骼动画,下面是播放这个动画的方式:

还是要得到这个AnimationState:AnimationState* as=entity->getAnimationState("动画名字");然后向上面一样操纵这个动画即可。

动态创作骨骼动画

大多数情况下我们都是向上面那样去创建ogre的骨骼动画,但是在一些情况下,我们希望只是在3d制作软件中创建骨骼的绑定关系,然而在程序中动态的编制这个skeleton的骨骼动画:

1、还是先导入这个绑定了skeleton的mesh到一个entity上,然后调用SkeletonInstance* ske=entiy->getSkeleton()得到这个骨骼

2、调用skeleton的createAnimation()函数为这个骨骼添加一个动画:Animation* anim=ske->createAnimation("My",1);

3、为这个skeleton的每一个bone创建track:

Bone* b0=ske->getRootBone(); 
NodeAnimationTrack* t0=anim->createNodeTrack(0,b0);//例如这是为root bone创建

然后在为每个bone的track创建关键帧

4最后调用entity->refreshAvailableAnimationState()来更新这个新加入的动画,然后仍然像上面那样得到这个animationstate来操纵动画的播放。

最后,在ogre中其实也完全可以在程序中动态的创建骨骼,然后绑定mesh,是这一步也不用3D软件制作,但是ogre好像不推荐这种方式,因为他们认为通常人们不需要这么做,但是某些情况其实还是需要这么做的

[ogre]ogre::Animation的更多相关文章

  1. [比较老的文章]三维渲染引擎 OGRE 与 OSG 的比较综述

    1 .引言随着计算机可视化.虚拟现实技术的飞速发展,人们对实时真实感渲染以及场景复杂度提出了更高的要求.传统的直接使用底层图形接口如OpenGL.DirectX开发图形应用的模式越来越暴露出开发复杂性 ...

  2. Unity3D和OGRE资源管理机制

    转自:http://www.tuicool.com/articles/QbMjUn 游戏中通常有大量资源,如网格.材质.纹理.动画.着色器程序和音乐等,游戏引擎作为做游戏的工具,自然要提供良好的资源管 ...

  3. [Ogre][地形][原创]基于OgreTerrain的地形实现

    需要用到的外部图片资源: 在ogre调用时需要多用到的几个外部dll: OgreTerrain_d.dll 需要添加头文件 #include "Ogre\Ogre.h"#inclu ...

  4. OGRE HelloWorld

    #include <OGRE/ExampleApplication.h> #include <OGRE/Ogre.h> class EnvMapApplication : pu ...

  5. 转:关于 OGRE 与 OSG 的简单比较

    1   前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<Ope ...

  6. 关于OGRE与OSG的简单比较【转】

    关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档, ...

  7. 关于 OGRE 与 OSG 的简单比较 (转)

    关于 OGRE 与 OSG 的简单比较 1   前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(man ...

  8. CG&Game资源(转)

    cg教程下载: http://cgpeers.com http://cgpersia.com http://bbs.ideasr.com/forum-328-1.html http://bbs.ide ...

  9. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

随机推荐

  1. Django的基本开发环境配置和MTV模型

    一.MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的 ...

  2. html08

    1.JQuery 是一个js框架一堆的 js文件 -形成 > 包 - 形成> 工具 - 形成> ->库 -> 框架 是一个轻量级的库 封装了js原生里js css dom ...

  3. BP神经网络原理详解

    转自博客园@编程De: http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html  http://blog.sina.com.cn/s/blog ...

  4. ASCII说明和ASCII对照表

    ASCII 说明 ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符.标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字 ...

  5. python excel操作 练习:#生成一个excel文件,生成3个sheet,每个sheet的a1写一下sheet的名称。每个sheet有个底色

    练习:#生成一个excel文件,生成3个sheet,每个sheet的a1写一下sheet的名称.每个sheet有个底色 #coding=utf-8 from openpyxl import Workb ...

  6. java android 环境变量配置备忘录

    java android 环境变量配置备忘录,全新重装系统要用到,备忘下来; JAVA_HOME D:\Java\jdk1.6.0_07 CLASSPATH  .;%JAVA_HOME%\lib\dt ...

  7. 使用Astah画UML类图经验总结

    从学习需求工程与UML开始,就开始接触到Astah这款软件,但是当时完全是为了对UML各种图的了解加深才使用了这款软件.当时画图,都是完全凭借自己想,并没有考虑实际情况,而且画的图都是很简单的,甚至有 ...

  8. 解决“ 故障模块名称: clr.dll ”

    错误内容: 微软的错误说明:http://support.microsoft.com/kb/2640103/zh-cn 类似下面的错误: 错误应用程序名称:xxx.exe,版本: 1.0.0.0,时间 ...

  9. UVA10298 Power Strings

    UVA10298 Power Strings hash+乘法逆元+一点点数学知识 我们用取余法算出主串的hash,然后从小到大枚举子串的长度 显然,如果若干个子串的复制的hash值之和等于主串的has ...

  10. 简单的Django实现图片上传,并存储进MySQL数据库 案例——小白

    目标:通过网页上传一张图片到Django后台,后台接收并存储进数据库 真是不容易!!这个案例的代码网上太乱,不适合我,自己摸索着写,终于成功了,记录一下,仅供自己参考,有的解释可能不对,自己明白就好, ...