添加R按键改变绘制模式,播放动画

class Example25FrameListener : public Ogre::FrameListener
{
public:Example25FrameListener(Ogre::SceneNode* node, RenderWindow* win, Camera* cam,Ogre::Entity* ent) : m_sceneNode(node), m_camera(cam), m_entity(ent){// 获得渲染窗口的句柄,将其转换成字符串;// 将渲染窗口的标识字符串"WINDOW"和渲染窗口的句柄字符串加到一个OIS::ParamList// 用OIS::ParamList创建一个OIS::InputManager// 用OIS::InputManager创建一个OIS::Keyboard// 在frameStarted中用OIS::Keyboard检测键盘事件size_t winHnd = 0;std::stringstream winHndStr;win->getCustomAttribute("WINDOW", &winHnd);winHndStr << winHnd;OIS::ParamList pl;pl.insert(std::make_pair(std::string("WINDOW"), winHndStr.str()));m_inputMgr = OIS::InputManager::createInputSystem(pl);m_keyBord = static_cast<OIS::Keyboard*>(m_inputMgr->createInputObject(OIS::OISKeyboard, false));m_mouse = static_cast<OIS::Mouse*>(m_inputMgr->createInputObject(OIS::OISMouse, false));m_moveSpeed = 2.0f;m_polygonMode = Ogre::PolygonMode::PM_SOLID;m_timer.reset();m_animState = m_entity->getAnimationState("RunBase");m_animState->setEnabled(true);m_animState->setLoop(false);m_animStateTop = m_entity->getAnimationState("RunTop");m_animStateTop->setEnabled(true);m_animStateTop->setLoop(false);m_walkSpeed = 50.0f;m_rotation  = 0.0f;}~Example25FrameListener(){m_inputMgr->destroyInputObject(m_keyBord);m_inputMgr->destroyInputObject(m_mouse);OIS::InputManager::destroyInputSystem(m_inputMgr);}// the render loop will closed if this function return falsebool frameStarted(const FrameEvent& evt){Ogre::Vector3 translateVec(0, 0, 0);m_keyBord->capture();if (m_keyBord->isKeyDown(OIS::KC_ESCAPE))return false;if (m_keyBord->isKeyDown(OIS::KC_W))translateVec += Ogre::Vector3(0, 0, -10);if (m_keyBord->isKeyDown(OIS::KC_S))translateVec += Ogre::Vector3(0, 0, 10);if (m_keyBord->isKeyDown(OIS::KC_A))translateVec += Ogre::Vector3(-10, 0, 0);if (m_keyBord->isKeyDown(OIS::KC_D))translateVec += Ogre::Vector3(10, 0, 0);// 利用定时器和R键更改绘制多边形模式if (m_keyBord->isKeyDown(OIS::KC_R) && m_timer.getMilliseconds() > 250){if (m_polygonMode == Ogre::PolygonMode::PM_SOLID)m_polygonMode = Ogre::PolygonMode::PM_WIREFRAME;else if (m_polygonMode == Ogre::PolygonMode::PM_WIREFRAME)m_polygonMode = Ogre::PolygonMode::PM_POINTS;else if (m_polygonMode == Ogre::PolygonMode::PM_POINTS)m_polygonMode = Ogre::PolygonMode::PM_SOLID;m_camera->setPolygonMode(m_polygonMode);m_timer.reset();}//m_sceneNode->translate(translateVec);m_sceneNode->translate(translateVec * evt.timeSinceLastFrame * m_moveSpeed);// 鼠标只旋转摄像机未旋转模型m_mouse->capture();float rot_x = m_mouse->getMouseState().X.rel * evt.timeSinceLastFrame  * (- 1);float rot_y = m_mouse->getMouseState().Y.rel * evt.timeSinceLastFrame  * (- 1);m_camera->yaw(Ogre::Radian(rot_x));m_camera->pitch(Ogre::Radian(rot_y));// Moves the camera's position by the vector offset provided // along it's own axes (relative to orientation).// 使摄像机跟随场景节点(模型)一起动m_camera->moveRelative(translateVec * evt.timeSinceLastFrame * m_moveSpeed);// 动画m_animState->addTime(evt.timeSinceLastFrame);m_animStateTop->addTime(evt.timeSinceLastFrame);bool walked = false;Ogre::Vector3 sinBadTranslate(0, 0, 0);if (m_keyBord->isKeyDown(OIS::KC_UP)){sinBadTranslate += Ogre::Vector3(0, 0, -1);m_rotation = 3.14f;walked = true;}else if (m_keyBord->isKeyDown(OIS::KC_DOWN)){sinBadTranslate += Ogre::Vector3(0, 0, 1);m_rotation = 0.0f;walked = true;}else if (m_keyBord->isKeyDown(OIS::KC_LEFT)){sinBadTranslate += Ogre::Vector3(-1, 0, 0);m_rotation = -1.57f;walked = true;}else if (m_keyBord->isKeyDown(OIS::KC_RIGHT)){sinBadTranslate += Ogre::Vector3(1, 0, 0);m_rotation = 1.57f;walked = true;}if (walked){m_animState->setEnabled(true);m_animStateTop->setEnabled(true);if (m_animState->hasEnded())m_animState->setTimePosition(0.0f);if (m_animStateTop->hasEnded())m_animStateTop->setTimePosition(0.0f);}else{m_animState->setEnabled(false);m_animStateTop->setEnabled(false);m_animState->setTimePosition(0.0f);m_animStateTop->setTimePosition(0.0f);}// 只移动了模型未移动摄像机m_sceneNode->translate(sinBadTranslate * evt.timeSinceLastFrame * m_walkSpeed);m_sceneNode->resetOrientation();m_sceneNode->yaw(Ogre::Radian(m_rotation));return true;}private:Ogre::SceneNode*   m_sceneNode;OIS::InputManager* m_inputMgr;OIS::Keyboard*     m_keyBord;OIS::Mouse*        m_mouse;Ogre::Camera*      m_camera;double             m_moveSpeed;Ogre::PolygonMode  m_polygonMode;Ogre::Timer        m_timer;// 播放动画的实体Ogre::Entity*        m_entity;// Represents the state of an animation and the weight of it's influence// 代表一个动画及动画关联的信息Ogre::AnimationState* m_animState;Ogre::AnimationState* m_animStateTop;// 模型移动速度float       m_walkSpeed;// 保存模型的旋转量float       m_rotation;
};class MyApplication :public ExampleApplication
{
public:MyApplication() : m_listener(NULL){}~MyApplication(){if (m_listener)delete m_listener;}void createCamera(){mCamera = mSceneMgr->createCamera("mycamera");mCamera->setPosition(0, 100, 200);mCamera->lookAt(0, 0, 0);mCamera->setNearClipDistance(5);}void createViewports(){// create a viewportOgre::Viewport* vp = mWindow->addViewport(mCamera);// set viewport's background colorvp->setBackgroundColour(Ogre::ColourValue(0.0f, 0.0f, 1.0f));// set aspect ratiomCamera->setAspectRatio(Real(vp->getActualWidth() / vp->getActualHeight()));}void createFrameListener(){m_listener = new Example25FrameListener(m_sinBadNode, mWindow, mCamera, m_sinBadEntity);mRoot->addFrameListener(m_listener);}void createScene(){// 先用定义的平面创建一个网格,再用创建的网格构造一个实体Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10);Ogre::MeshManager::getSingleton().createPlane("plane",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane, 1500, 1500, 200, 200,true, 1, 5, 5, Vector3::UNIT_Z);Ogre::Entity* ent = mSceneMgr->createEntity("lightpalneentity", "plane");Ogre::SceneNode* node = mSceneMgr->createSceneNode("node");mSceneMgr->getRootSceneNode()->addChild(node);node->attachObject(ent);ent->setMaterialName("Examples/BeachStones");// 方向光不用设置位置Ogre::Light* light = mSceneMgr->createLight("light");light->setType(Ogre::Light::LT_DIRECTIONAL);//light->setDiffuseColour(Ogre::ColourValue(1.0f, 1.0f, 1.0f));light->setDirection(Ogre::Vector3(1, -1, 0));m_sinBadEntity = mSceneMgr->createEntity("sinbad", "Sinbad.mesh");m_sinBadNode = node->createChildSceneNode("sinbadnode");m_sinBadNode->setScale(3.0f, 3.0f, 3.0f);m_sinBadNode->setPosition(Ogre::Vector3(0.0f, 4.0f, 0.0f));m_sinBadNode->attachObject(m_sinBadEntity);// 设置阴影mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);Ogre::Entity* sword1 = mSceneMgr->createEntity("sword1", "Sword.mesh");Ogre::Entity* sword2 = mSceneMgr->createEntity("sword2", "Sword.mesh");m_sinBadEntity->attachObjectToBone("Handle.L", sword1);m_sinBadEntity->attachObjectToBone("Handle.R", sword2);// 输出模型关联的所有的动画的名字Ogre::AnimationStateSet* set = m_sinBadEntity->getAllAnimationStates();Ogre::AnimationStateIterator ite = set->getAnimationStateIterator();while (ite.hasMoreElements()){std::cout<<ite.getNext()->getAnimationName()<<std::endl;}}
private:Ogre::SceneNode*     m_sinBadNode;Ogre::FrameListener* m_listener;Ogre::Entity*        m_sinBadEntity;
};int main()
{MyApplication app;app.go();return 0;
}

  

Ogre 2011-11-29相关推荐

  1. 英雄远征(9:20--11:29)30级体验

    英雄远征(9:20--11:29)30级体验 1级任务指引提升等级,体验游戏.   2级任务指引领取装备礼包.(亮点)   3级任务指引领取武器(亮点)   4级任务指引玩家领取武器并使用.(亮点) ...

  2. 我在Salira的800天(2009.5.20~2011.7.29)

     我在Salira的800天(2009.5.20~2011.7.29) 一.感谢篇 Content 零.序 一.感谢篇 1. Salira 2. L 3. J 二.工作篇 三.研究与学习篇 四.总结篇 ...

  3. 重新开始 2011/11/25

    在csdn上写过几篇文章,始终没有坚持下来,也是由于自己没有一个明确的目标的缘故:当自己感觉乱的时候,总是想改变点东西,重新开始,改变了博客类的东西就真的能重新开始吗?现在我想换个博客就换个博客,这是 ...

  4. 史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29完善更新小程序代码,

    2021.11.29 更新文章 你好,我是博主宁在春,一起学习吧!!! 写这篇文章的原因,主要是因为最近在写毕业设计,用到了小程序,这中间曲曲折折,一言难尽啊.毕业设计真的让人麻脑阔

  5. 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置

    - 11.28 限定某个目录禁止解析php - 11.29 限制user_agent - 11.30/11.31 php相关配置 - 扩展 - apache开启压缩 http://ask.apelea ...

  6. 11.29 广州国际设计周

    11.29 广州国际设计周 转载于:https://www.cnblogs.com/liugod/archive/2007/11/16/961534.html

  7. 11.29晚 心情 晴 既然选择了Linux这条路就要坚持走下去

    11.29 命令: 第一节: 1.touch创建文件 实例 touch testfile 2.cat主要有三大功能: 一次显示整个文件 cat filename 从键盘创建一个文件 cat > ...

  8. 专业导论-课后总结-2019.11.29

    专业导论-课后总结-2019.11.29 在经过学习有关计算机的硬件组成之后,我们进入了计算机的另一个重要组成部分--计算机的网络.如果要我说出计算机与它最开始的不同的话,我会说,网络.网络使得计算机 ...

  9. 11月最新新萝卜家园GhostXP SP3 电脑城装机极致版系统2011.11

    新萝卜家园GhostXP SP3电脑城装机极致版2011.11+ 一.主要更新: ========================== * 更新了系统补丁和Office2003所有补丁到2011-11 ...

  10. Could not read document: Failed to parse Date value ‘2020-07-15 11:29:46‘

    时间格式问题好像是挺复杂的一个问题,但操作起来其实也不难,后台接收时间的时候要看前台传过来的格式是什么样子的,最近有遇到这个问题 Could not read document: Failed to ...

最新文章

  1. 5G NGC — 关键技术 — CUPS
  2. Linux 下系统调用的三种方法
  3. Spring Session 的两种刷新模式-RedisFlushMode
  4. QT学习笔记(十三):绘制图像
  5. Django开发自己的博客系统
  6. android键盘输出增加按键码
  7. 解决了!联邦学习+推荐系统,冷启动和数据隐私问题双双K.O
  8. D3DXIntersectTri 求三角形与射线相交
  9. Chrome浏览器插件之---AdBlock和Adblock Plus
  10. Android 开发工具一键下载
  11. J2EE与中间件技术
  12. 计算机主机后面辐射大,电脑背面辐射最大吗
  13. trivial destructor
  14. 视频剪辑技巧,给每个视频添加不同背景图
  15. es6去除重复项_ES5 ES6中Array对象去除重复项的方法总结
  16. yocto的bitbake过程记录
  17. 电脑蓝屏了怎么办修复,电脑蓝屏解决修复方法
  18. 解决mysql的赋权操作之GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION问题
  19. 工业网关需要具备的能力及分类
  20. 百度地图api周边搜索功能

热门文章

  1. python输入转化为数字_Python中如何将输入数据转换为数字?
  2. Appdelegate跳转到指定tabbaritem
  3. java invoker_Spring的HTTPInvoker
  4. java jni 参数_Java 与 JNI 互传数据的那些事
  5. 国际10-20标准电极位置
  6. “无路之门”,一款VR恐怖冒险游戏
  7. 戴上VR眼镜来场球赛?开启上帝视角
  8. 用数学方式打开Facebook新Logo,真的和视频号Logo来自同一方程
  9. 戴森要搞能爬楼梯的吸尘器,两项专利设计现已提交
  10. SciHub下载量成论文影响力预测指标:能被下载的论文被引次数高出72%