• Ogre:Animation(Ogre中的动画)


     在Ogre中Animation是一块非常重要的部分,但是笔者在学习Ogre的动画时遗憾的发现关于Ogre中动画的资料非常的少,Ogre的sample中只有最简单的导入一个骨骼动画的例子,在网上也很少有人谈及,Ogre Wiki中的教程也是边边角角,不知这么重要的部分为什么不做一个全面的tutorial。我从网上的仅有的一些资料和自己的亲自试验总结了一下基本的Ogre动画的使用,当然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好像不推荐这种方式,因为他们认为通常人们不需要这么做,但是某些情况其实还是需要这么做的,关于在程序中动态创建与绑定骨骼我没有找到任何资料,自己写了下程序也是有问题的,希望有这么做过的高人提供宝贵资料和我交流!

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leonwei/archive/2010/08/17/5819248.aspx

    发表于 @ 2010年11月18日 21:57:00 | 评论( 0 ) | 编辑| 举报| 收藏

    旧一篇:Ogre:StaticObject和projective mapping | 新一篇:09游戏公司年报点评 几家欢喜几家愁
    查看最新精华文章 请访问博客首页相关文章发表评论表 情:          评论内容: 用 户 名:登录 注册 匿名评论 匿名用户验 证 码:  重新获得验证码
      热门招聘职位【EF 全球研发中心】赴美工作机会 诚招IT精英【鸿联九五】高薪诚聘手机游戏服务器程序 期待热爱游戏的你加盟【MediaV】技术类职位热招,欢迎应届毕业生【北京天健科技】诚聘.net架构师,高级软件开发工程师(.net , Powerbuilder)【叠拓】北欧领先IT服务公司诚聘英才 北京+成都+杭州【瀚信科技】诚聘 WINDOWS C++ WINDOWS C#中高级开发工程师【酷我音乐盒】高薪诚聘 激情爱好工作融为一体【达内集团】高薪诚聘JAVA讲师.嵌入式讲师.3G讲师.技术总监.分公司总经理【天际网】急聘Java应用架构师、高级Java工程师、网页设计师【上海酷娱】高薪急聘服务器主程、服务器程序【创新工场】技术类职位热招,立即加入属于你自己的公司【宽娱数码】诚聘C++应用软件工程师(多媒体/网络方向)、.net开发工程师【EF 全球研发中心】赴美工作机会 诚招IT精英【鸿联九五】高薪诚聘手机游戏服务器程序 期待热爱游戏的你加盟【MediaV】技术类职位热招,欢迎应届毕业生【北京天健科技】诚聘.net架构师,高级软件开发工程师(.net , Powerbuilder)【叠拓】北欧领先IT服务公司诚聘英才 北京+成都+杭州【瀚信科技】诚聘 WINDOWS C++ WINDOWS C#中高级开发工程师【酷我音乐盒】高薪诚聘 激情爱好工作融为一体【达内集团】高薪诚聘JAVA讲师.嵌入式讲师.3G讲师.技术总监.分公司总经理【天际网】急聘Java应用架构师、高级Java工程师、网页设计师【上海酷娱】高薪急聘服务器主程、服务器程序【创新工场】技术类职位热招,立即加入属于你自己的公司【宽娱数码】诚聘C++应用软件工程师(多媒体/网络方向)、.net开发工程师 公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
    北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    江苏乐知网络技术有限公司 提供商务支持
     Email:webmaster@csdn.net
    Copyright © 1999-2010, CSDN.NET, All Rights Reserved
     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pizi0475/archive/2010/11/18/6020095.aspx

  • 相关阅读:
    备忘
    跨域问题思考
    个人理解的Lambda表达式的演化过程
    MySql 事务与锁
    Python连接MySQL
    将python虚拟环境移植到无法联网的电脑
    PyQt5+QtDesigner+fbs+python创建桌面程序
    Pycharm+Anaconda安装及配置
    一个极好的JavaScript学习网址
    Python GUI工具Tkinter以及拖拉工具Page安装
  • 原文地址:https://www.cnblogs.com/lizhengjin/p/1913901.html
Copyright © 2020-2023  润新知