1.使用模型中预设的动画
Ogre中使用这个变量保存动画状态:Ogre::AnimationState* _aniState;
主要用到的函数有:
_ent = ent;
_aniState = _ent ->getAnimationState("Dance");
_aniState ->setEnabled(true);
_aniState ->setLoop(true);
还有重要的一句要放在frameStarted(或者其他帧监听函数)中。
_aniState ->addTime(evt.timeSinceLastFrame);
这样才能让动画每一帧都更新,同时,通过对参数乘以不同的数字还可以改变动画的播放速度。如:
_aniState ->addTime(evt.timeSinceLastFrame * 0.25);
2.混合两个或以上的动画
只需要添加一个新的动画状态,并且像上面的一样初始化即可。
_aniStateTop = _ent ->getAnimationState("RunTop");
_aniStateTop ->setEnabled(true);
_aniStateTop ->setLoop(true);
3.用户交互动画
暂且就这么叫吧。。。
主要就是增加几个变量,walked表示是否在走,SinbadTranslate保存移动向量,_rotation保存旋转向量,等等。
主要代码如下:
bool walked = false;
Ogre::Vector3 SinbadTranslate(0, 0, 0);
if(_key ->isKeyDown(OIS::KC_UP))
{
SinbadTranslate += Ogre::Vector3(0, 0, -1);
_rotation = 3.14f;
walked = true;
}
if(_key ->isKeyDown(OIS::KC_DOWN))
{
SinbadTranslate += Ogre::Vector3(0, 0, 1);
_rotation = 0.0f;
walked = true;
}
if(_key ->isKeyDown(OIS::KC_LEFT))
{
SinbadTranslate += Ogre::Vector3(-1, 0, 0);
_rotation = -1.57f;
walked = true;
}
if(_key ->isKeyDown(OIS::KC_RIGHT))
{
SinbadTranslate += Ogre::Vector3(1, 0, 0);
_rotation = 1.57f;
walked = true;
}
if(walked)
{
_aniState ->setEnabled(true);
_aniStateTop ->setEnabled(true);
if(_aniState ->hasEnded())
{
_aniState ->setTimePosition(0.0f);
}
if(_aniStateTop ->hasEnded())
{
_aniStateTop ->setTimePosition(0.0f);
}
}
else
{
_aniState ->setTimePosition(0.0f);
_aniState ->setEnabled(false);
_aniStateTop ->setTimePosition(0.0f);
_aniStateTop ->setEnabled(false);
}
_node ->translate(SinbadTranslate * evt.timeSinceLastFrame * _WalkingSpeed);
_node ->resetOrientation();
_node ->yaw(Ogre::Radian(_rotation));
注意,没有在走和走完了一个动画周期是需要用setTimePosition来将动画设定为起始点的,因为这里没有将动画循环设为true。
4.挂接东西
Ogre::Entity* sword1 = mSceneMgr ->createEntity("Sword1", "Sword.mesh");
Ogre::Entity* sword2 = mSceneMgr ->createEntity("Sword2", "Sword.mesh");
_SinbadEnt ->attachObjectToBone("Handle.L", sword1);
_SinbadEnt ->attachObjectToBone("Handle.R", sword2);
代码很简单,涉及到模型,那是美工的事情,呃。