OGRE(六)

来源:互联网 发布:如何连接网络摄像头 编辑:程序博客网 时间:2024/05/15 03:07
#include "OGRE/Ogre.h"#include "OIS/OIS.h"class MyFrameListener:public Ogre::FrameListener{public:bool frameStarted(const Ogre::FrameEvent &evt){//std::cout<<"Frame Start"<<std::endl;_key->capture();if (_key->isKeyDown(OIS::KC_ESCAPE)){return false;}Ogre::Vector3 translate(0,0,0);if(_key->isKeyDown(OIS::KC_W)){translate += Ogre::Vector3(0,0,-10);}if(_key->isKeyDown(OIS::KC_S)){translate += Ogre::Vector3(0,0,10);}if(_key->isKeyDown(OIS::KC_A)){translate += Ogre::Vector3(-10,0,0);}if(_key->isKeyDown(OIS::KC_D)){translate += Ogre::Vector3(10,0,0);}_cam->moveRelative(translate*evt.timeSinceLastFrame * _movementSpeed);_mouse->capture();float rotX = _mouse->getMouseState().X.rel * evt.timeSinceLastFrame * -1;float rotY = _mouse->getMouseState().Y.rel * evt.timeSinceLastFrame * -1;_cam->yaw(Ogre::Radian(rotX));_cam->pitch(Ogre::Radian(rotY));return true;}bool frameEnded(const Ogre::FrameEvent& evt){//std::cout<<"Frame End"<<std::endl;return true;}bool frameRenderingQueued(const Ogre::FrameEvent& evt){//std::cout<<"Frame Queued"<<std::endl;return true;}MyFrameListener(Ogre::RenderWindow* win, Ogre::Camera* cam, Ogre::Viewport* viewport){_cam = cam;_movementSpeed = 50.0f;OIS::ParamList pl;unsigned int windowHandle = 0;std::ostringstream windowHandleStr;//该类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sprintfwin->getCustomAttribute("WINDOW",&windowHandle);windowHandleStr << windowHandle;//格式化 pl.insert(std::make_pair("WINDOW",windowHandleStr.str()));_man = OIS::InputManager::createInputSystem(pl);_key = static_cast<OIS::Keyboard*>(_man->createInputObject(OIS::OISKeyboard,false));_mouse = static_cast<OIS::Mouse*>(_man->createInputObject(OIS::OISMouse,false));_viewport = viewport;_comp1 = false;_comp2 = false;_comp3 = false;_down1 = false;_down2 = false;_down3 = false;}~MyFrameListener(){_man->destroyInputObject(_key);_man->destroyInputObject(_mouse);OIS::InputManager::destroyInputSystem(_man);}private:OIS::InputManager* _man;OIS::Keyboard* _key;OIS::Mouse* _mouse;Ogre::Camera* _cam;float _movementSpeed;Ogre::Viewport* _viewport;bool _comp1, _comp2, _comp3;bool _down1, _down2, _down3;};class MyApplication{private:Ogre::SceneManager* _sceneManager;//场景管理器Ogre::Root* _root;//根节点MyFrameListener* _listener;bool _keepRunning;public://载入资源void loadResources(){Ogre::ConfigFile cf;//助手类,用于加载配置文件cf.load("resources_d.cfg");//载入配置文件Ogre::ConfigFile::SectionIterator sectionIter =cf.getSectionIterator();//得到一个遍历块的迭代器Ogre::String sectionName, typeName, dataname;//块名,键,值//开始通过迭代器遍历资源while (sectionIter.hasMoreElements()){sectionName = sectionIter.peekNextKey();//得到块Ogre::ConfigFile::SettingsMultiMap *settings = sectionIter.getNext();//得到mapOgre::ConfigFile::SettingsMultiMap::iterator i;//定义一个map的迭代器for (i = settings->begin(); i != settings->end(); ++i)//对块里头的键-值进行迭代{typeName = i->first;//获得键dataname = i->second;//获得值//根据块,键,值来载入资源Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname, typeName, sectionName);}}//初始化所有的资源组Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();}//创建场景void createScene(){Ogre::Entity*ent=_sceneManager->createEntity("Sinbad.mesh");_sceneManager->getRootSceneNode()->attachObject(ent);}//开始渲染int startup(){_root = new Ogre::Root("plugins_d.cfg");//载入插件if(!_root->showConfigDialog())//弹出黑框框,如果出错或者用户点取消则返回{return -1;}//通过root,初始化-----渲染窗口和场景管理器Ogre::RenderWindow* window = _root->initialise(true,"Ogre3DBeginners Guide");_sceneManager = _root->createSceneManager(Ogre::ST_GENERIC);//通过场景管理器实例化------摄像头Ogre::Camera* camera = _sceneManager->createCamera("Camera");camera->setPosition(Ogre::Vector3(0,0,50));camera->lookAt(Ogre::Vector3(0,0,0));camera->setNearClipDistance(5);//通过渲染窗口和摄像机实例化------视口Ogre::Viewport* viewport = window->addViewport(camera);viewport->setBackgroundColour(Ogre::ColourValue(0.0,0.0,0.0));//设置视口为黑色camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));_listener = new MyFrameListener(window,camera,viewport);_root->addFrameListener(_listener);loadResources();//载入资源createScene();//画画//因为剧情需要,把startRendering注释了╮(╯▽╰)╭//_root->startRendering(); //开始渲染,因为我们给了root很多东西,他就在他的循环里头自己玩了,不会返回return 0;}void renderOneFrame(){Ogre::WindowEventUtilities::messagePump();_keepRunning = _root->renderOneFrame();}bool keepRunning(){return _keepRunning;}MyApplication(){_sceneManager = NULL;_root = NULL;_listener = NULL;}~MyApplication(){delete _root;delete _listener;}};int main(){/*Ogre::Root* root = new Ogre::Root("plugins_d.cfg");if (!root->showConfigDialog()){return -1;}Ogre::RenderWindow* window = root->initialise(true,"Ogre3D Beginners Guide");Ogre::SceneManager* sceneManager = root->createSceneManager(Ogre::ST_GENERIC);Ogre::Camera* camera = sceneManager->createCamera("Camera");camera->setPosition(0,0,50);camera->lookAt(0,0,0);camera->setNearClipDistance(5);Ogre::Viewport* viewport = window->addViewport(camera);viewport->setBackgroundColour(Ogre::ColourValue(0,0,0));camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));Ogre::ConfigFile cf;cf.load("resources_d.cfg");Ogre::ConfigFile::SectionIterator sectionIter = cf.getSectionIterator();  //迭代器好像都不是指针Ogre::String sectionName, typeName, dataname;while (sectionIter.hasMoreElements()){sectionName = sectionIter.peekNextKey();Ogre::ConfigFile::SettingsMultiMap *settings = sectionIter.getNext();Ogre::ConfigFile::SettingsMultiMap::iterator i;for (i = settings->begin(); i != settings->end(); ++i){typeName = i->first;dataname = i->second;Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname,typeName,sectionName);}}//Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../../Media/packs/Sinbad.zip","Zip");Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();Ogre::Entity* ent = sceneManager->createEntity("Sinbad.mesh");sceneManager->getRootSceneNode()->attachObject(ent);root->startRendering();*/MyApplication app;app.startup();while(app.keepRunning()){app.renderOneFrame();}return 0;}

0 0
原创粉丝点击