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

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

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

baixingzhi2917的博客 317

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

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

Ogre3d:OGRE中的Animation动画基础

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

栾继阳's 1367

电力市场小白必看:手把手教你用Matlab实现市场出清电价计算(附完整代码)

本文为电力市场初学者提供了使用Matlab计算市场出清电价的完整指南。通过Yalmip和Matpower工具包,详细讲解了从环境配置到模型构建、求解及结果分析的整个过程,帮助读者快速掌握节点电价计算的核心技术。

weixin_30379531的博客 73

【OWL部署】Manus又一开源平替OWL真的很好用吗?手把手带你部署并运行你的AI助手OWL(对接Qwen、硅基流动接口)

本文介绍了通用人工智能OWL的部署及国内接口对接,全篇干货满满,手把手教学。

MosuoLc的博客 4042

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

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

燕良@游戏开发 5217

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 412

OGRE 动画

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

痞子龙3D编程 6383

基于车牌识别的停车收费系统的设计与实现(源码+开题)

本系统(程序源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景: 随着城市化进程的加速和汽车保有量的增加,停车难成为了一个普遍存在的问题。传统的停车收费方式存在着效率低下、管理混乱等问题。因此,开发一款基于车牌识别的停车收费系统具有重要的现实意义。研究意义: 基于车牌识别的停车收费系统可以有效地解决传统停车收费方式在效率和准确性方面的问题,提高停车服务的效率和质量。

迟限程序设计 1391

小米万兆路由器里的Docker安装可道云(Kodexplorer)私有网盘

小米2022年12月份发布了万兆路由器,里面可以使用Docker。 今天尝试在小米的万兆路由器里安装[可道云](http://kodcloud.com/)(Kodexplorer)私有网盘。

engchina的专栏 1万+

OGRE骨骼动画的读取和播放

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

Hi_Panda 2784

Arcgis模型构建器01——写一个简单的模型

在使用模型构建器解决这个需求之前,我们要想清楚如果我们手动解决的话,应该如何去处理,因为构建模型的过程正是基于我们手动处理的过程来构建的。我有一个全国的dem影像数据和一个陕西省边界范围矢量,现在我想获取陕西省的dem影像的坡度数据。填写完之后点击确定,我们发现,两个输入数据和工具连接起来了,并且通过裁剪工具得到一个中间结果,即。我们发现工具框和中间数据框都存在阴影,说明已经运行过了这个模型,不报错就说明模型运行成功!现在我们就把数据和工具都串联起来了,成功构建好了模型。

爱吃雪糕的小布丁的博客 918

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

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

weixin_30677073的博客 153

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 683

硬件工程师入门基础知识(一)基础元器件认识(二)

我们的电路输入一般是只有两种状态,0V 或者是其它的高电平(1.8V,3.3V,5V 等),截止状态一般不用怎么考虑,因为如果让三极管的 Vbe=0,自然就截止了,重要的是饱和状态如何保证。也就是说只要 Rb

小幽余生不加糖 1万+

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

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

神秘代码 2794

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

Everything is possible 3629

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

DIY OGRE的面部动画

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

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

Ogre测试代码

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

探索者专栏 457

Ogre手动添加骨骼动画

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

Hi_Panda 1314

OGRE中的人脸动画

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

Augmented Reality & Computer Graphics 1035

使用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 3978
上一篇: Ogre切换摄像头
下一篇: ogre接入cegui
缥缈的云
博客等级 码龄15年 94粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值