Ogre播放动画

Ogre:Animation(Ogre中的动画    在Ogre中Animation是一块非常重要的部分,但是笔者在学习Ogre动画时遗憾的发现关于Ogre动画的资料非常的少,Ogre的sample中只有最简单的导入一个骨骼动画的例子,在网上也很少有人谈及,Ogre Wiki中的教程也是边边角角,不知这么重要的部分为什么不做一个全面的tutorial。我从网上的仅有的一些资料和自己的亲自试验总结了一下基本的Ogre动画的使用,当然Ogre动画模块非常庞大,我总结的只是冰山一角,但是也是最常用的部分。    Ogre动画框架: 阅读详情
Ogre播放动画
ogre播放动画很简单,1、得到动画状态,2、设置enable为true,3、调用addtime
先来看代码:
class TutorialApplication : public BaseApplication
{
public:
    TutorialApplication(void);
    virtual ~TutorialApplication(void);

protected:
    virtual void createScene(void);
	virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);
private:
	bool nextLocation();

	std::deque<Ogre::Vector3> mWalkList;
	Ogre::Real mDistance;
	Ogre::Real mWalkSpd;
	Ogre::Vector3 mDirection;
	Ogre::Vector3 mDestination;
	Ogre::AnimationState* mAnimationState;
	Ogre::Entity* mEntity;
	Ogre::SceneNode* mNode;

};
//---------------------------------------------------------------------------
TutorialApplication::TutorialApplication(void):
	mDistance(0),
	mWalkSpd(70.0),
	mDirection(Ogre::Vector3::ZERO),
	mDestination(Ogre::Vector3::ZERO),
	mAnimationState(0),
	mEntity(0),
	mNode(0)
{
}
//---------------------------------------------------------------------------
TutorialApplication::~TutorialApplication(void)
{
}

//---------------------------------------------------------------------------
void TutorialApplication::createScene(void)
{
    // Create your scene here :)

	mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0,1.0,1.0));
	mEntity = mSceneMgr->createEntity("robot.mesh");

	mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Ogre::Vector3(0,0,25.0));
	mNode->attachObject(mEntity);

	mWalkList.push_back(Ogre::Vector3(550.0, 0, 50.0));
	mWalkList.push_back(Ogre::Vector3(-100.0, 0, -200.0));
	mWalkList.push_back(Ogre::Vector3(0, 0, 25.0));

	Ogre::Entity* ent;
	Ogre::SceneNode* node;

	ent = mSceneMgr->createEntity("knot.mesh");
	node = mSceneMgr->getRootSceneNode()->createChildSceneNode(
		Ogre::Vector3(0, -10.0, 25.0));
	node->attachObject(ent);
	node->setScale(0.1, 0.1, 0.1);

	ent = mSceneMgr->createEntity("knot.mesh");
	node = mSceneMgr->getRootSceneNode()->createChildSceneNode(
		Ogre::Vector3(550.0, -10.0, 50.0));
	node->attachObject(ent);
	node->setScale(0.1, 0.1, 0.1);

	ent = mSceneMgr->createEntity("knot.mesh");
	node = mSceneMgr->getRootSceneNode()->createChildSceneNode(
		Ogre::Vector3(-100.0, -10.0,-200.0));
	node->attachObject(ent);
	node->setScale(0.1, 0.1, 0.1);

	mCamera->setPosition(90.0, 280.0, 535.0);
	mCamera->pitch(Ogre::Degree(-30.0));
	mCamera->yaw(Ogre::Degree(-15.0));

	mAnimationState = mEntity->getAnimationState("Idle");
	mAnimationState->setLoop(true);
	mAnimationState->setEnabled(true);


}

bool TutorialApplication::frameRenderingQueued(const Ogre::FrameEvent& evt)
{
	if (mDirection == Ogre::Vector3::ZERO)
	{
		if (nextLocation())
		{
			mAnimationState = mEntity->getAnimationState("Walk");
			mAnimationState->setLoop(true);
			mAnimationState->setEnabled(true);
		}
	}
	else
	{
		Ogre::Real move = mWalkSpd * evt.timeSinceLastFrame;
		mDistance -= move;

		if (mDistance <= 0.0)
		{
			mNode->setPosition(mDestination);
			mDirection = Ogre::Vector3::ZERO;

			if (nextLocation())
			{
				Ogre::Vector3 src = mNode->getOrientation() * Ogre::Vector3::UNIT_X;

				if ((1.0 + src.dotProduct(mDirection)) < 0.0001)
				{
					mNode->yaw(Ogre::Degree(180));
				}
				else
				{
					Ogre::Quaternion quat = src.getRotationTo(mDirection);
					mNode->rotate(quat);
				}
			}
			else
			{
				mAnimationState = mEntity->getAnimationState("Idle");
				mAnimationState->setLoop(true);
				mAnimationState->setEnabled(true);
			}
		}
		else
		{
			mNode->translate(move * mDirection);
		}
	}

	mAnimationState->addTime(evt.timeSinceLastFrame);

	return BaseApplication::frameRenderingQueued(evt);
}

bool TutorialApplication::nextLocation()
{
	if (mWalkList.empty())
		return false;

	mDestination = mWalkList.front();
	mWalkList.pop_front();
	mDirection = mDestination - mNode->getPosition();
	mDistance = mDirection.normalise();

	return true;
}
这里创建了一个机器人,然后让它走路。走完了之后,切换动画为idle.


Ogre LittleMeshViewer:3D模型与动画开源查看器 本文还有配套的精品资源,点击获取 简介:Ogre LittleMeshViewer是一款基于Ogre3D引擎的开源软件,旨在为开发者提供直观的工具来查看和测试3D网格模型和骨架动画。支持多种3D模型文件格式,并允许用户调整渲染参数与进行交互操作。软件提供了骨架动画的展示、播放和编辑功能,帮助优化动画效果。其利用Ogre3D的强大功能,实现高级图形处理,源代码的开源为开发者提... 阅读详情

相关推荐

OGRE 动画源码解析及动画创建步骤

学习ogre非常好的资料,本人从网上搜集下来,特贡献出来供大家分享,此文章对我的学习帮助很大,希望对大家有所帮助.

Ogre动画加载之节点动画、mesh动画及骨骼动画加载方法

在Max中,动画分为两种动画,即Node Animations动画及Mesh Animations动画: 导出文件之后,Node Animations动画是在xx.scene文件中, <node name="huosaixinganzuzhong_qinang_Catheterization"> <position...

baixingzhi2917的博客 315

一个ogre动画演示实例

ogre动画演示实例,源代码,轻松学习ogre

Ogre3d:OGRE中的Animation动画基础

OGRE中调用模型预先设定好的动画并不是非常困难。当然,是说这部分工作是交给建模人员的前提下。         创建动画的代码相当简单。如下即可: 头文件加上: AnimationState* mAnimState;//实例动画状态对象

栾继阳's 1363

Ogre学习笔记(8):骨骼动画

       OGRE的基本动画控制是很简单的,设置一个动画的操作是这样:        // Set idle animationmAnimationState = ent->getAnimationState( "Idle" );   mAnimationState->setLoop( true );mAnimationState->setEnabled( true );(

燕良@游戏开发 5212

OGRE 动画

动画是由若干静态画面,快速交替显示而成。因人的眼睛会产生视角暂留,对上一个画面的感知还末消失,下一张画面又出现,就会有动的感觉。计算机图形学中的动画也同样遵循着这一本质的原理。只不过不同于传统动画的手绘和拍摄,Ogre图形引擎可以通过自动或半自动的方式实时产生并播放动画图片。 不过Ogre本身并不能像人一样了解场景中动画角色动作的具体含义,例如它不能明确的知道什么是抬手或者走路,只能

痞子龙3D编程 6376

OGRE骨骼动画的读取和播放

OGRE 本身附带了两套比较完整的骨骼动画模型,保存在 OGRE\Samples\Media\models 目录下,一套是机器人 ( robot.mesh 和 robot.skeleton ) ,一套是忍者 ( ninja.mesh 和 ninja.skeleton ) 。其中忍者的模型多边形数比较高,动作也比较丰富和细腻。我们就使用这个现成的忍者模型来学习骨骼动画的读取和播放OGRE 的角色模

Hi_Panda 2780

转载:OGRE一起学(十二) 骨骼动画的读取和播放

第十二章 骨骼动画的读取和播放 OGRE 本身附带了两套比较完整的骨骼动画模型,保存在 OGRE\Samples\Media\models 目录下,一套是机器人 ( robot.mesh 和 robot.skeleton ) ,一套是忍者 ( ninja.mesh 和 ninja.skeleton ) 。其中忍者的模型多边形数比较高,动作也比较丰富和细腻。我们就使用这个现成的忍者模型来学习骨骼...

weixin_30677073的博客 151

Ogre中级教程(一): 动画, 两点间移动, 和四元数基础

Ogre中级教程中级教程一 来自 Ogre wiki 动画, 两点间移动, 和四元数基础 作者: Culver. 内容       目录      [隐藏]        1 介绍         2 前期准备         3 准备开始         4 设置场景         5 动画         6 移动角色         7 巩固练习           7.1 简单问题   

神秘代码 2786

Ogre编程入门与进阶】第九章 动画

9.1 动画基础         动画是基于人的视觉原理创建的运动图像。人的眼睛通过视觉暂留效应,当对上一个画面的感知还未消失时,下一张画面又出现,这样就会有动的感觉。计算机图形学中的动画也同样遵循着这一原理。在三维软件中创建动画,需要为每个动画序列设置起始帧、结束帧和关键帧,中间帧由软件自身计算完成。         Ogre本身不会对对象的速度、加速度进行跟踪,不能像人一样了解场景中动画

Everything is possible 3624

Ogre测试代码

Demo 代码: #include "OgreApp.h" #include <OgreRTShaderSystem.h> COgreApp::COgreApp() :OgreBites::ApplicationContext("OgreTutorialApp"){ mCamPosZ = 20; mFishRotate = 0; mCam...

探索者专栏 455

Ogre手动添加骨骼动画

///初始化骨骼动画参数 Animation::setDefaultInterpolationMode(Animation::IM_LINEAR); Animation::setDefaultRotationInterpolationMode(Animation::RIM_LINEAR); ///得到实体 Ogre::Entity* ent = m_pRenderBox->get

Hi_Panda 1311

DIY OGRE的面部动画

通过前面[1,2]将OGRE中的facial.mesh转换为xml进行分析后,明白了OGRE中Pose Animation的实现原理:在顶点初始位置与偏移位置(由poseoffset指定)之间进行线性插值。比如:顶点位置为:x = 1 , y = 1 , z = 1,poseof

在那西天取经的路上。。。 408

OGRE中的人脸动画

[前言:在Ogre的Facial Demo中采用了顶点动画(确切点说是Pose Animation)让面部产生面部表情及发音动画,本文简单介绍了顶点动画的概念,并结合Facial Demo,探讨如何实现Pose Animation。]         顶点动画是直接使用顶点让网格(mesh)产生动画的一种方式。每一组动作在顶点动画中对应一个顶点数据实体。顶点动画被存储在.mesh文件中,因为它与网

Augmented Reality & Computer Graphics 1033

使用Ogre 3D 运动模型 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第五章

文章来源:http://www.cnblogs.com/oneDouble/articles/2587193.html 这章的重点会在模型动作和它们通常是怎样工作上,特别是在Ogre 3D 方面。没有运动,那么一个3D场景是没有生机的。运动是使场景现实和有趣的最重要的因素之一。   在这一章,我们将会: ※ 播放一个运动。 ※...

173

XSI Vertex Animation and OGRE Facial Animation

    目前OGRE只有XSI 5.x、Maya的导出器及oFusion Pro for 3ds max(收费)支持顶点动画的导出,而在众多建模软件中XSI(http://www.softimage.com/)以其对变形动画的支持最为突出,OGRE提供的Facial Demo中使用的Dr. Bunsen的头就是XSI中提供的一个示例动画,该模型就是使用对顶点簇(cluster)的位置改变来产生动画

Heath's Blog 3977
上一篇: Ogre切换摄像头
下一篇: ogre接入cegui
缥缈的云
博客等级 码龄15年 94粉丝 179原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值