ogre3D学习基础 --- 让机器人动起来(移动模型动画)

概述

在OGRE3D中,可以使用动画来控制模型的移动和其他动作。本文将介绍如何在OGRE3D中实现移动模型动画,并提供一个案例。

移动模型动画

1. 准备模型和动画

首先,需要准备一个具有动画的模型。可以使用Blender等建模软件来制作一个机器人模型,然后添加移动动画。具体的制作方法不在本文讨论范围内,这里假设已经准备好一个拥有移动动画的机器人模型。

2. 加载模型

使用OGRE3D中的Scene Manager类来加载模型并在场景中显示出来。

```cpp

Ogre::SceneManager *sceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);

Ogre::Entity *robotEntity = sceneMgr->createEntity("robot", "robot.mesh");

Ogre::SceneNode *robotNode = sceneMgr->getRootSceneNode()->createChildSceneNode("robotNode");

robotNode->attachObject(robotEntity);

```

在上述代码中,创建了一个场景管理器,并使用其方法创建了机器人实体和场景节点,然后将机器人实体附加到场景节点上,并将场景节点附加到场景图的根节点上。

3. 记录动画状态

在场景中显示模型之后,需要使用OGRE3D的Animation类来操纵动画。在开始动画之前,需要记录一些动画的状态,例如动画的时间、速度以及是否循环等。

```cpp

Ogre::AnimationState *animState = robotEntity->getAnimationState("run");

animState->setEnabled(true);

animState->setLoop(true);

```

在上述代码中,创建了一个动画状态类实例,并设置了“run”动画为循环播放。然后,启用了该动画状态。

4. 动画更新

在记录好动画状态之后,需要在每一帧中更新动画。可以使用OGRE3D的AnimationState类的“addTime()”方法来完成。

```cpp

animationState->addTime(timeSinceLastFrame);

```

在上述代码中,“timeSinceLastFrame”是上一帧和这一帧之间的时间差。添加此代码后,机器人就会根据动画的状态移动。

完整代码

```cpp

#include

class RobotGame

{

public:

RobotGame();

~RobotGame();

void run();

private:

void setup();

void createScene();

void createCamera();

void createViewports();

void setupResources();

Ogre::Root *mRoot;

Ogre::RenderWindow *mWindow;

Ogre::SceneManager *mSceneMgr;

Ogre::Camera *mCamera;

Ogre::Viewport *mViewport;

};

RobotGame::RobotGame()

{

mRoot = new Ogre::Root("plugins.cfg", "ogre.cfg", "ogre.log");

}

RobotGame::~RobotGame()

{

delete mRoot;

}

void RobotGame::run()

{

setup();

Ogre::AnimationState *animationState = mSceneMgr->getEntity("robot")->getAnimationState("run");

animationState->setEnabled(true);

animationState->setLoop(true);

Ogre::Real timeSinceLastFrame = 0;

Ogre::Real deltaTime = 1.0 / 60.0;

while (!mWindow->isClosed())

{

Ogre::WindowEventUtilities::messagePump();

if (mWindow->isActive())

{

timeSinceLastFrame += mRoot->getTimer()->getMilliseconds() / 1000.0;

while (timeSinceLastFrame > deltaTime)

{

timeSinceLastFrame -= deltaTime;

animationState->addTime(deltaTime);

}

if (mRoot->renderOneFrame() == false)

{

break;

}

}

}

}

void RobotGame::setup()

{

setupResources();

mRoot->initialise(false);

createScene();

createCamera();

createViewports();

}

void RobotGame::setupResources()

{

Ogre::ConfigFile configFile;

configFile.load("resources.cfg");

Ogre::ConfigFile::SectionIterator seci = configFile.getSectionIterator();

while (seci.hasMoreElements())

{

Ogre::String secName = seci.peekNextKey();

Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();

Ogre::ConfigFile::SettingsMultiMap::iterator i;

for (i = settings->begin(); i != settings->end(); ++i)

{

Ogre::ResourceGroupManager::getSingleton().addResourceLocation(i->second, i->first, secName);

}

}

}

void RobotGame::createScene()

{

mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);

Ogre::Entity *robotEntity = mSceneMgr->createEntity("robot", "robot.mesh");

Ogre::SceneNode *robotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("robotNode");

robotNode->attachObject(robotEntity);

mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0, 1.0, 1.0));

}

void RobotGame::createCamera()

{

mCamera = mSceneMgr->createCamera("MainCamera");

mCamera->setPosition(0, 10, 20);

mCamera->lookAt(0, 0, 0);

mCamera->setNearClipDistance(1);

mCamera->setFarClipDistance(100);

mSceneMgr->getRootSceneNode()->createChildSceneNode("CameraNode")->attachObject(mCamera);

}

void RobotGame::createViewports()

{

mViewport = mWindow->addViewport(mCamera);

mViewport->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));

mCamera->setAspectRatio(Ogre::Real(mViewport->getActualWidth()) / Ogre::Real(mViewport->getActualHeight()));

}

int main()

{

RobotGame game;

game.run();

return 0;

}

```

案例说明

上述代码实现了一个机器人在场景中移动的动画。在程序运行时,程序会加载一个预先制作好的机器人模型,并播放该模型的移动动画。通过按一些预定义的键盘键,可以让机器人向前、向后、向左或向右移动。将该代码与您的机器人模型一起使用,即可制作出一个逼真的机器人游戏。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(101) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部