Ogre默认支持四种脚本动画:1.骨骼动画 2.场景节点动画 3.顶点动画 4.数值动画
1.骨骼动画 :
骨骼动画的基础:在ogre中骨骼动画主要涉及两个类,mesh和skeleton,skeleton由许多Bone组成,这些bone之间有层级关系,skeleton就是一个骨架关系,某个mesh可以被绑定在这个skeleton上,绑定的实质就是某个vertex受某些bone的影响,也就是某个bone运动,就会导致和他有关系的那些vertex运动。所以对照本页最上面的图,他最末端控制的店就是skeleton中的每个bone,一个skeleton中可以蕴含多套animation。
一般情况下骨骼动画都是在maya或3Dmax之类的工具里面制作好的,然后通过导出方式,导出到一个mesh文件和一个skeleton文件。ogre在加载模型的时候已经把这些动画加载好,需要直接使用就行了。
AnimationState* as=entity->getAnimationState("动画名字");
动态创作骨骼动画:在另外一些情况下,我们只是在skeleton文件中设置网格顶点与骨骼的绑定关系,而不描述骨骼的运动轨迹。运动轨迹会动态的根据实际情况生成,这对于物理碰撞检测后的动画效果是很常见的。
//1.把skeleton和mesh文件内容加载到entity,此时绑定了骨骼与顶点但是没有实现动画效果... //获取entity中的相应骨骼 SkeletonInstance* ske=entiy->getSkeleton(); //为骨骼添加一个动画 Animation* anim=ske->createAnimation("My",1); //为每一块骨头创建track(动作集) Bone* b0=ske->getRootBone(); NodeAnimationTrack* t0=anim->createNodeTrack(0,b0);//例如这是为root bone创建 //为每个bone的track创建关键帧... //更新这个新加入的动画 entity->refreshAvailableAnimationState();
2.场景节点动画:
是指让场景中的某些结点运动,如创建camera的动画等。
// 创建Animation Animation* anim=smgr->createAnimation(); // 设置插值方式:线性的和样条线(样条线的更加平滑) anim->setInterpolationMode(Animation::IM_SPLINE); //为需要动画的节点创建一个Track,节点动画是以节点为单位 NodeAnimationTrack* t0=anim->createNodeTrack(0,node); //对于每个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)); //创建一个AnimationState用于控制动画 AnimationState* as=smgr->createAnimationState(该动画名字); as->setEnabled(true); //必须设置为true才能被播放 as->setTimePosition();//在帧监听中通过调用这个函数来播放动画
3.顶点动画:
顶点动画大多情况下利用gpu shader来实现以提高效率,所以较少直接使用ogre的动画机制。
4.数值动画:我的理解是跟传统的一副一副图片组成的动画类似,这种方式效率低下,游戏肯定是不会用到的。