在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好像不推荐这种方式,因为他们认为通常人们不需要这么做,但是某些情况其实还是需要这么做的,关于在程序中动态创建与绑定骨骼我没有找到任何资料,自己写了下程序也是有问题的,希望有这么做过的高人提供宝贵资料和我交流!
分享到:
相关推荐
本篇文章将基于提供的"ogre动画演示实例",深入探讨Ogre引擎中的动画机制,并结合源代码分析,帮助读者轻松掌握Ogre在3D动画处理上的核心技巧。 一、Ogre动画系统概述 Ogre的动画系统是其强大功能之一,它支持骨骼...
在`frameStarted()`方法中,添加代码来加载和启动动画: ```cpp // Load the animation Ogre::Animation* anim = _ent->getSkeleton()->getAnimation("walk"); // Create an AnimationState for the loaded ...
通过`Ogre::Entity`类创建游戏角色对象,并利用`Ogre::AnimationState`来管理角色的动画播放状态。在贪食蛇游戏中,这些实体可以代表蛇的身体各个部分。 ##### 4\. 移动控制 ```cpp float _WalkingSpeed; float _...
根据Face.mesh.xml改写的模型,可以比较清晰的看到Ogre的mesh格式,附有简单注释。
例如,他们可能需要使用`Ogre::Animation`和`Ogre::AnimationState`类来读取、合并和管理动画,同时利用`Ogre::Skeleton`类处理骨架结构。 标签中的"Skeleton"指的是3D模型的骨骼结构,它是3D动画的基础。在Ogre中...
3. 应用动画:通过AnimationState接口设置动画状态,控制模型播放特定的动作。 4. 更新动画:在每一帧中更新骨骼动画,确保模型的动态表现。 六、优化与性能 尽管Ogre提供了高效的骨骼动画机制,但大型场景中的...
`AnimationState`对象用于控制动画的播放。 8. **渲染与视图port**: 视图port是渲染目标的定义,可以设置不同的渲染参数,如分辨率、颜色格式等。每个视图port对应一个`RenderWindow`,可以在同一窗口内创建多个...
- **Skeleton与Animation**:骨骼和动画用于制作角色的动作,OGRE支持骨骼动画和关键帧动画。 4. **光照与渲染** - **Light**:OGRE支持多种类型的光源,如点光源、平行光和聚光灯,它们影响场景中的光照效果。 ...
API(Application Programming Interface)是OGRE的核心部分,它为开发者提供了一系列接口和类,使得程序员能够高效地控制3D场景的渲染、光照、纹理、动画以及其他图形特性。 在OGRE API中,主要包含以下几个关键...
Ogre动画分类,以及创建动画和播放动画相关技术
通过《Ogre API手册》中的`OgreAPIReference.chm`,开发者可以查找每个类、方法、常量的详细说明,了解其用途、参数和返回值,以及示例代码,从而更好地理解和运用Ogre的各类功能。这份手册是Ogre开发者不可或缺的...
`AnimationState`用于控制动画播放。 总结,ogre网格读取与显示涉及了资源管理、网格加载、3D物体创建、材质设定、光照处理和性能优化等多个方面。理解并熟练掌握这些知识点,是开发高效、高质量3D应用程序的关键。...
开发者可以创建复杂的动画序列,并通过Animation State控制器进行管理。 10. **输入处理** OGRE通过Input Manager处理用户输入,如键盘、鼠标等。开发者可以注册事件处理器来响应这些输入,实现交互功能。 11. **...
2. 3D物体创建与管理:在Ogre中,你可以学习到如何加载和创建不同的3D模型,包括Mesh、Skeleton和Animation。此外,源码还会展示如何为物体添加材质和纹理,调整其外观效果。 3. 光照与阴影:Ogre支持多种光照模型...
1. **动画系统**: 使用`AnimationState`和`Skeleton`实现角色的骨骼动画。 2. **粒子系统**: `ParticleSystem`允许创建烟雾、火花、火焰等特效。 3. **脚本语言支持**: OGRE支持AngelScript、Lua等脚本语言,方便非...
9. **状态模式**:在动画系统中,CharacterState或AnimationState的切换体现了状态模式,让角色依据不同状态执行相应动作。 10. **模板方法模式**:RenderSystem类中的renderOneFrame()函数是一个典型的模板方法,...
总的来说,这个Ogre中级教程是学习Ogre游戏开发中动画、移动和定向操作的好资源,对于想要深入理解和应用Ogre框架的开发者来说极具价值。通过逐步实践和解决教程中提出的问题,开发者能够熟练掌握这些核心概念和技术...
实现Ogre地形跟Havok的物理计算,车辆系统跟地形的实时碰撞检测。Havok物理动画通过Ogre渲染,感兴趣的加入110120763群
- 动画(Animation):为实体添加动画,使其更加生动。 - 碰撞检测(Collision Detection):实现物体之间的相互作用,如碰撞反应。 - 物理模拟(Physics Simulation):模拟真实世界的物理现象,增加游戏的真实感。 5...