10.animation

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);
代码很简单,涉及到模型,那是美工的事情,呃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值