Приложения
          
 
          Приложение А 
           
          Руководство пользователя 
           
          Программа для запуска приложения расположена в папке Demo и называется Present3D.exe. Для корректной работы программы, во время её старта из выпадающего списка нужно выбрать графическую библиотеку для рендера DirectX. В случае если на машине не установлена данная библиотека, в папке Demo приложен файл для установки dxwebsetup.exe. 
           
          Разработка и загрузка собственных 3D моделей. 
           
          Для разработки моделей потребуется Blender 2.66. После разработки анимации у 3D модели, обязательно нужно назвать анимацию Walk. 
           
          После разработки 3D моделей, требуется настроить экспортер для использования моделей в движке. В папке с приложением находится файл io_export_ogreDotScene.py, который нужно переместить в расположение C:\Program Files\Blender\2.66\scripts\addons. После перемещения нужно зайти в Blender и активировать данный скрипт, для этого выполнить действия: 
          
             
            Перейти в User Preferences
  
             
            Открыть вкладку Addons
  
             
            Найти в списке OGRE Exporter и активировать галочку на этом скрипте
  
            
          Экспорт модели проводится в меню File > Export > Ogre3D (.scene and .mesh), затем нужно выбрать директорию для сохранения файла. 
           
          Следующие файлы создаются при экспорте модели из Blender: 
          
             
            .mesh – основной файл модели
  
             
            .material – файл материала (если материал применялся)
  
             
            .skeleton – файл анимации (если модель имеет анимацию)
  
            
          Все такие файлы после экспорта требуется упаковать в zip архив и переместить в папку с приложением по пути Demo/media/packs. 
           
          После перемещения архива с моделью требуется добавить в конфигурационный файл resources.cfg путь к созданной модели в таком виде Zip=media/packs/NameModel.zip 
           
          На месте NameModel должно быть такое имя модели, которое содержит расширение .mesh в архиве. 
           
          Для добавления описания в виде текста к модели, нужно создать текстовый файл с названием, которое содержит расширение .mesh в архиве, и поместить в расположение Demo\media\text. 
           
          Работа с программой. 
           
          При запуске программы перед пользователем появляются созданные им модели. При выборе модели мышкой, камера подлетает к модели и затем появляется информационный текст о модели, а также анимация модели, если она существует. Для того, чтобы вернуться на исходную позицию камеры, нужно нажать кнопку «Вернуться». Кнопка «Остановить камеру» включает режим свободного манипулирования камерой при помощью мыши и кнопок WASD. 
           
          Меню настроек. 
           
          В меню настроек можно манипулировать моделями, для этого требуется перейти в меню настроек, выделить мышкой модель и с помощью кнопок манипулирования можно перемещать модель в пространстве и разворачивать вокруг своей оси. 
           
           Приложение Б 
           
          Программный код 
          BasicApp.h 
          #ifndef BASICAPP_H 
           
          #define BASICAPP_H 
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
           
          #include 
          #include 
           
          #include 
           
          #include 
           
          #include 
          #include 
           
          #include 
          #include 
          #include 
           
          #include 
           
          #include 
          #include "textMgr.h" 
           
          #include 
           
          #include 
           
          #include 
          class BasicApp 
           
          : public Ogre::WindowEventListener, 
           
          public Ogre::FrameListener, 
           
          public OIS::KeyListener, 
           
          public OIS::MouseListener 
           
          { 
           
          public: 
           
          BasicApp(); 
           
          ~BasicApp(); 
          void go(); 
          private: 
           
          bool mShutdown; 
          //Setup - Main 
           
          Ogre::Root* mRoot; 
           
          Ogre::Camera* mCamera; 
           
          Ogre::SceneManager* mSceneMgr; 
           
          Ogre::RenderWindow* mWindow; 
           
          Ogre::String mResourcesCfg; 
           
          Ogre::String mPluginsCfg; 
           
          OgreBites::SdkCameraMan* mCameraMan; 
           
          Ogre::SceneNode* lNode;//записываем подгружаемые меши 
           
          Ogre::Entity* room; 
           
          Ogre::SceneNode* roomNode; 
           
          Ogre::AnimationState* anim; 
          //Setup - Render 
           
          virtual bool frameRenderingQueued(const Ogre::FrameEvent& fe); 
          //Setup - Keyboard 
           
          virtual bool keyPressed(const OIS::KeyEvent& ke); 
           
          virtual bool keyReleased(const OIS::KeyEvent& ke); 
          float mRotSpd; 
           
          bool mMovableFound; 
           
          bool mLMouseDown, mRMouseDown; 
          Ogre::Vector3 prevPositionModel; 
          //Setup - Mouse 
           
          virtual bool mouseMoved(const OIS::MouseEvent& me); 
           
          virtual bool mousePressed(const OIS::MouseEvent& me, OIS::MouseButtonID id); 
           
          virtual bool mouseReleased(const OIS::MouseEvent& me, OIS::MouseButtonID id); 
          //Setup - Window 
           
          virtual void windowResized(Ogre::RenderWindow* rw); 
           
          virtual void windowClosed(Ogre::RenderWindow* rw); 
          //Setup - application 
           
          bool setup(); 
           
          bool configure(); 
           
          void chooseSceneManager(); 
           
          void createCamera(); 
           
          void createScene(); 
           
          void destroyScene(); 
           
          void createFrameListener(); 
           
          void createViewports(); 
           
          void setupResources(); 
           
          void createResourceListener(); 
           
          void loadResources(); 
          // CEGUI 
           
          CEGUI::OgreRenderer* mRenderer; 
           
          bool setupCEGUI(); 
          // OIS 
           
          OIS::Mouse* mMouse; 
           
          OIS::Keyboard* mKeyboard; 
           
          OIS::InputManager* mInputMgr; 
          //Terrain 
           
          Ogre::TerrainGroup* mTerrainGroup; 
           
          Ogre::TerrainGlobalOptions* mTerrainGlobals; 
          //Setup - Scene 
           
          Ogre::RaySceneQuery* mRayScnQuery;//луч, опрашиваемый сцену 
           
          bool goDefaultPosition;//останавливает камеру при нажатии 
           
          void handleCameraCollision(); 
          //GUI - Buttons 
           
          CEGUI::Window *buttonCameraSetPosition;//возвращения камеры на позицию 
           
          CEGUI::Window *buttonQuit;//выход 
           
          CEGUI::Window* textbox1;//текст для модели 
           
          CEGUI::Window* textShadow; 
           
          CEGUI::Window* menuButton; //меню настроек 
           
          CEGUI::Window* scalePlusButton; //увеличение скейла 
           
          CEGUI::Window* scaleMinusButton; //уменьшение скейла 
           
          CEGUI::Window* translateModelToLeftButton; //модельку влево 
           
          CEGUI::Window* translateModelToRightButton; //модельку вправо 
           
          CEGUI::Window* translateModelToTopButton; //модельку вперёд 
           
          CEGUI::Window* translateModelToBackButton; //модельку назад 
           
          CEGUI::Window* translateModelToUpButton; //модельку вверх 
           
          CEGUI::Window* translateModelToDownButton; //модельку вниз 
           
          CEGUI::Window* rotateRightModelButton; //поворачиваем модельку вправо 
           
          CEGUI::Window* rotateLeftModelButton; //поворачиваем модельку влево 
           
          CEGUI::Window* backMainWindowButton;//назад из меню настроек на главную 
           
          CEGUI::Window* checkShadow; 
           
          CEGUI::Window* releaseCamera; 
           
          CEGUI::Window* tipsText; 
           
          CEGUI::Window* tipsSettingText; 
           
          CEGUI::Window* tipsRoomText; 
           
          CEGUI::Window* tipsObjectText; 
          CEGUI::Window* scaleRoomPlusButton; //увеличение скейла 
           
          CEGUI::Window* scaleRoomMinusButton; //уменьшение скейла 
          //GUI - Subscribes buttons 
           
          void eventRoomScalePlus(); 
           
          void eventRoomScaleMinus(); 
           
          void eventModelScalePlus(); 
           
          void eventModelScaleMinus(); 
           
          void eventModelTranslateLeft(); 
           
          void eventModelTranslateRight(); 
           
          void eventModelTranslateTop(); 
           
          void eventModelTranslateBack(); 
           
          void eventModelTranslateUp(); 
           
          void eventModelTranslateDown(); 
           
          void eventModelRotateRight(); 
           
          void eventModelRotateLeft(); 
           
          bool eventMenuButton(const CEGUI::EventArgs &e); 
           
          bool quit(const CEGUI::EventArgs &e);//обработчик кнопки выхода 
           
          bool setDefaultPosition(const CEGUI::EventArgs &e);//обработчик кнопки cameraDefaultPosition 
           
          bool eventBackWindow(const CEGUI::EventArgs &e);//обработчик кнопки backMainWindow 
          void checkShadows(); 
          //Timers 
           
          Ogre::Timer timer1; 
           
          Ogre::Timer timer2; 
          //Work with text model 
          std::vector myVector; //вектор названий мешей в конфиге 
           
          char result[100]; //выходное название меша 
           
          CEGUI::String encodeRussian(wchar_t string[100]); //декодируем в русский текст 
          //Inside classes & SDK 
           
          textMgr* textManager; 
           
          TiXmlDocument *file_settings; 
           
          TiXmlDocument *file_room_settings; 
          //GUI - Alpha 
           
          void goInAlpha(CEGUI::Window* win); //функция ухода в альфу 
           
          void goFromAlpha(CEGUI::Window* win); //функция выхода из альфы 
           
          bool goFromAlphaButton;//если моделька выделена, вытаскиваем кнопку из альфы 
          //GUI - Widgets 
           
          CEGUI::Window* sheetMgr;//менеджер виджетов 
           
          CEGUI::Window *sheetMainWindow;//виджет главного окна 
           
          CEGUI::Window *sheetMainMenu;//виджет меню настроек 
          //Setup - XML setting 
           
          void configureXmlSettings(); 
           
          void removeFromXmlElderData(); 
           
          void configureXmlSettingsD(const char * nameModel, Ogre::Vector3 &locationVector, Ogre::Vector3 &scaleVector, double &rotate, Ogre::Vector3 &scaleRoomVector); 
           
          bool tipsEnabled; 
           
          }; 
          #endif 
          BasicApp.cpp 
          #include "BasicApp.h" 
           
           
          BasicApp::BasicApp() 
           
          : mShutdown(false), 
           
          mRoot(0), 
           
          mCamera(0), 
           
          mSceneMgr(0), 
           
          mWindow(0), 
           
          mResourcesCfg(Ogre::StringUtil::BLANK), 
           
          mPluginsCfg(Ogre::StringUtil::BLANK), 
           
          mCameraMan(0), 
           
          mRenderer(0), 
           
          mMouse(0), 
           
          mKeyboard(0), 
           
          mInputMgr(0), 
           
          mTerrainGroup(0), 
           
          mTerrainGlobals(0), 
           
          mRotSpd(0.1), 
           
          mLMouseDown(false), 
           
          mRMouseDown(false), 
           
          mRayScnQuery(0), 
           
          goDefaultPosition(false), 
           
          goFromAlphaButton(false), 
           
          sheetMainWindow(0), 
           
          textManager(0), 
           
          sheetMainMenu(0), 
           
          sheetMgr(0) 
          { 
           
          myVector.clear(); 
           
          file_settings = new TiXmlDocument("modelSettings.xml"); 
           
          file_room_settings = new TiXmlDocument("settings.xml"); 
           
          } 
           
          BasicApp::~BasicApp() 
           
          { 
           
          if (mCameraMan) delete mCameraMan; 
          mSceneMgr->destroyQuery(mRayScnQuery); 
          Ogre::WindowEventUtilities::removeWindowEventListener(mWindow, this); 
           
          windowClosed(mWindow); 
          delete mRoot; 
           
          } 
          void BasicApp::go() 
           
          { 
           
          #ifdef _DEBUG 
           
          mResourcesCfg = "resources_d.cfg"; 
           
          mPluginsCfg = "plugins_d.cfg"; 
           
          #else 
           
          mResourcesCfg = "resources.cfg"; 
           
          mPluginsCfg = "plugins.cfg"; 
           
          #endif 
          if (!setup()) 
           
          return; 
          mRoot->startRendering(); 
          destroyScene(); 
           
          } 
          bool BasicApp::frameRenderingQueued(const Ogre::FrameEvent& fe) 
           
          { 
           
          if (mKeyboard->isKeyDown(OIS::KC_ESCAPE)) 
           
          mShutdown = true; 
          if (mShutdown) 
           
          return false; 
          if (mWindow->isClosed()) 
           
          return false; 
          mKeyboard->capture(); 
           
          mMouse->capture(); 
          mCameraMan->frameRenderingQueued(fe); 
          eventRoomScalePlus(); 
           
          eventRoomScaleMinus(); 
           
          eventModelScalePlus(); 
           
          eventModelScaleMinus(); 
           
          eventModelTranslateLeft(); 
           
          eventModelTranslateRight(); 
           
          eventModelTranslateTop(); 
           
          eventModelTranslateBack(); 
           
          eventModelTranslateUp(); 
           
          eventModelTranslateDown(); 
           
          eventModelRotateRight(); 
           
          eventModelRotateLeft(); 
          checkShadows(); 
           
           
          for(int i = 0; i < myVector.size(); i++) 
           
          { 
           
          //если активно главное окно и выделена моделька 
           
          if ( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && sheetMainWindow->isActive() ) 
           
          { 
           
          Ogre::Vector3 needPosition = mSceneMgr->getSceneNode(myVector[i])->getPosition() + Ogre::Vector3(200,50,50); 
           
          mCamera->move( (needPosition - mCamera->getPosition() ) * fe.timeSinceLastFrame ); 
           
          mCamera->lookAt(mSceneMgr->getSceneNode(myVector[i])->getPosition() + Ogre::Vector3(0,50,50) ); 
           
          textbox1->setVisible(true); 
          prevPositionModel = mSceneMgr->getSceneNode(myVector[i])->getPosition(); 
          tipsEnabled = false; 
          wchar_t cameraText[100] = L"Вернуться"; 
           
          buttonCameraSetPosition->setText( encodeRussian(cameraText) ); 
           
           
          if (mSceneMgr->getEntity(myVector[i])->hasAnimationState("Walk")) 
           
          { 
           
          anim = mSceneMgr->getEntity(myVector[i])->getAnimationState("Walk"); 
           
          anim->setLoop(true); 
           
          anim->setEnabled(true); 
           
          anim->addTime(fe.timeSinceLastFrame); 
           
          } 
          } 
           
          } 
           
          if (goDefaultPosition) 
           
          { 
           
          Ogre::Vector3 needPosition(500, 350, 150); 
           
          mCamera->move( (needPosition - mCamera->getPosition() ) * fe.timeSinceLastFrame ); 
           
          mCamera->lookAt(prevPositionModel); 
           
          wchar_t cameraText[100] = L"Остановить камеру"; 
           
          buttonCameraSetPosition->setText( encodeRussian(cameraText) ); 
          for(int i = 0; i < myVector.size(); i++) 
           
          { 
           
          if ( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && mSceneMgr->getEntity(myVector[i])->hasAnimationState("Walk")) 
           
          { 
           
          anim->setEnabled(false); 
           
          } 
           
          } 
           
          } 
          tipsText->setVisible(tipsEnabled); 
          CEGUI::System::getSingleton().injectTimePulse(fe.timeSinceLastFrame); 
           
          return true; 
           
          } 
           
          void BasicApp::eventRoomScalePlus() 
           
          { 
          if (static_cast(scaleRoomPlusButton)->isPushed() ) 
           
          { 
           
          Ogre::Real needScaleX = roomNode->getScale().x * 1.001f; 
           
          Ogre::Real needScaleY = roomNode->getScale().y; 
           
          Ogre::Real needScaleZ = roomNode->getScale().z * 1.001f; 
          roomNode->setScale(needScaleX, needScaleY, needScaleZ); 
           
          } 
          } 
          void BasicApp::eventRoomScaleMinus() 
           
          { 
          if (static_cast(scaleRoomMinusButton)->isPushed() ) 
           
          { 
           
          Ogre::Real needScaleX = roomNode->getScale().x * 0.999f; 
           
          Ogre::Real needScaleY = roomNode->getScale().y; 
           
          Ogre::Real needScaleZ = roomNode->getScale().z * 0.999f; 
          roomNode->setScale(needScaleX, needScaleY, needScaleZ); 
           
          } 
          } 
          void BasicApp::eventModelScalePlus() 
           
          { 
           
          for(int i = 0; i < myVector.size(); i++) 
           
          { 
           
          if ( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast(scalePlusButton)->isPushed() ) 
           
          { 
           
          Ogre::Vector3 needScale = mSceneMgr->getSceneNode(myVector[i])->getScale() * 1.001f; //костыль на скейл 
           
          mSceneMgr->getSceneNode(myVector[i])->setScale(needScale); 
           
          } 
           
          } 
           
          } 
          void BasicApp::eventModelScaleMinus() 
           
          { 
           
          for(int i = 0; i < myVector.size(); i++) 
           
          { 
           
          if ( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast(scaleMinusButton)->isPushed() ) 
         |