OGRE动画实现(模型自己动)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

std::deque mWalkList; // The list of points we are walking to

Real mWalkSpeed; // The speed at which the object is moving

};

class MoveDemoApplication : public ExampleApplication

{

protected:

public:

MoveDemoApplication()

{

}

~MoveDemoApplication()

{

}

protected:

Entity *mEntity; // The entity of the object we are animating

SceneNode *mNode; // The SceneNode of the object we are moving

std::deque mWalkList; // A deque containing the waypoints

void createScene(void)

{

}

void createFrameListener(void)

{

mFrameListener= new MoveDemoListener(mWindow, mCamera, mNode, mEntity,

mWalkList);

mFrameListener->showDebugOverlay(true);

mRoot->addFrameListener(mFrameListener);

}

};

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32

#define WIN32_LEAN_AND_MEAN

#include “windows.h”

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )

#else

int main(int argc, char **argv)

#endif

{

// Create application object

MoveDemoApplication app;

try {

app.go();

} catch( Exception& e ) {

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32

MessageBox( NULL, e.getFullDescription().c_str(), "An exception has

occured!",

MB_OK | MB_ICONERROR | MB_TASKMODAL);

#else

fprintf(stderr, “An exception has occured: %s\n”,

e.getFullDescription().c_str());

#endif

}

return 0;

}

稍加解释一下框架代码:

在MoveDemoApplication中预先定义的三个变量。

Entity *mEntity;                // The entity of the object we are animating

SceneNode *mNode;               // The SceneNode of the object we are moving

std::deque mWalkList;  // A deque containing the waypoints

我们创建的entity实例保存在变量mEntity中。

我们创建的node实例保存在mNode中。

mWalkList包含了所有我们希望对象行走到的节点,他是deque类型,你可以把它想象成是一种双向链表的结构。书中解释为deque对象是一个高效的双端对列。他的基本使用函数有:

1、push_front和push_back方法分别将对象放入队列的前端和后端。

2、front和back方法分别返回当前队列前端和后端的元素

(注意:这里最好有判空的习惯,用if( empty() ) )pop_front和pop_back两个方法分别从队列两端移除对象。最后,empty方法返回该队列是否为空。

一、创建场景(createScene()函数中添加代码)

// Set the default lighting.创建环境光很亮,能够看到所有物体

mSceneMgr->setAmbientLight( ColourValue( 1.0f, 1.0f, 1.0f ) );

// Create the entity创建实体

mEntity = mSceneMgr->createEntity( “Robot”, “robot.mesh” );

// Create the scene node创建场景节点

mNode = mSceneMgr->getRootSceneNode( )->

createChildSceneNode( “RobotNode”, Vector3( 0.0f, 0.0f, 25.0f ) );

mNode->attachObject( mEntity );

// Create the walking list创建总动路线上的关键点放到高效的两端队列里

mWalkList.push_back( Vector3( 550.0f,  0.0f,  50.0f  ) );

mWalkList.push_back( Vector3(-100.0f,  0.0f, -200.0f ) );

// Create objects so we can see movement创建关键点的标记物

Entity *ent;

SceneNode *node;

ent = mSceneMgr->createEntity( “Knot1”, “knot.mesh” );

node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( “Knot1Node”,

Vector3(  0.0f, -10.0f,  25.0f ) );

node->attachObject( ent );

node->setScale( 0.1f, 0.1f, 0.1f );

ent = mSceneMgr->createEntity( “Knot2”, “knot.mesh” );

node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( “Knot2Node”,

Vector3( 550.0f, -10.0f,  50.0f ) );

node->attachObject( ent );

node->setScale( 0.1f, 0.1f, 0.1f );

ent = mSceneMgr->createEntity( “Knot3”, “knot.mesh” );

node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( “Knot3Node”,

Vector3(-100.0f, -10.0f,-200.0f ) );

node->attachObject( ent );

node->setScale( 0.1f, 0.1f, 0.1f );

// Set the camera to look at our handywork创建摄像机

mCamera->setPosition( 90.0f, 280.0f, 535.0f );

mCamera->pitch( Degree(-30.0f) );

mCamera->yaw( Degree(-15.0f) );

至此你可以运行一下,看看基本的环境。

二、动画制作

1、你需要从实体对象里获取AnimationState。

2、设置它的选项,并激活它。

3、你还必须在每一帧后给它添加时间,才能让动画动起来。

MoveDemoListener的构造函数中添加代码(这只是个小练习,之后会删除这些代码)

// Set idle animation

mAnimationState = ent->getAnimationState(“Idle”);

mAnimationState->setLoop(true);

mAnimationState->setEnabled(true);

第二行从实体中获取到了AnimationState。

第三行我们调用setLoop( true ),让动画不停地循环。

第四行才把这个动画真正激活。

但是,Idle是从哪里来的呢?每个mesh都有它们自己定义的动画集。为了能够查看某个mesh的全部动画,你需要下载OgreMeshViewer才能看到,我们可以在maya中将这些动作定义好,导出的时候,给相应的clip起好名字就可以了。

最后,还需要在每一帧里根据时间来更新这个动画的状态。找到MoveDemoListener::frameStarted方法,在方法的开头添加这一行:

mAnimationState->addTime(evt.timeSinceLastFrame);

根据Idle这个动作,机器人至此已经可以原地踏步了!

——————————————————————————-————————————————

三、移动机器人

变量说明

机器人移动的方向保存到mDirection里面。

当前机器人前往的目的地保存在mDestination里。

mDistance保存机器人离目的地的距离。

mWalkSpeed里保存机器人的移动速度。

MoveDemoListener中添加代码:

清空MoveDemoListener构造器(第二步的代码只是想让我们知道如何调用基本的动画的流程)

速度设为每秒35个单位,把mDirection设成零向量,因为后面会用它来判断机器人是否正在行走。

// Set default values for variables

mWalkSpeed = 35.0f;

mDirection = Vector3::ZERO;

MoveDemoListener::frameStarted()中add之前添加代码:

if (mDirection == Vector3::ZERO)

{

if (nextLocation())

{

// Set walking animation

mAnimationState = mEntity->getAnimationState(“Walk”);

mAnimationState->setLoop(true);

mAnimationState->setEnabled(true);

}

}

else   //mDirection != Vector3::ZERO

{

Real move = mWalkSpeed * evt.timeSinceLastFrame;

mDistance -= move;//路程=速度*时间

//检测是否“走过”了目标地点。如果现在mDistance小于0,则“跳”到这点上并设置移动到下一个地点

//把mDirection设置成零向量。如果nextLocation方法不改变mDirection(即没有其它地方可去)

//则不再四处移动了

if (mDistance <= 0.0f)

{

mNode->setPosition(mDestination);

mDirection = Vector3::ZERO;

// Set animation based on if the robot has another point to walk to.

if (! nextLocation())

{

// Set Idle animation

mAnimationState = mEntity->getAnimationState(“Idle”);

mAnimationState->setLoop(true);

mAnimationState->setEnabled(true);

}

else

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

mAnimationState = mEntity->getAnimationState(“Idle”);

mAnimationState->setLoop(true);

mAnimationState->setEnabled(true);

}

else

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
[外链图片转存中…(img-KEdfiTSe-1714736369528)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值