четверг, 16 июня 2011 г.

Ogre3D Начало

Для начала необходимо скачать движок OGRE, скачивать нужно ту версию SDK, которая подходит для вашей среды программирования (около 50 мегабайт), либо компилировать из исходников.
Я опишу процесс создания для Visual Studio 2008 (9 версия) и OgreSDK 1.6.5_VC90 я думаю будет работать и на новых версиях, по крайней мере на это надеюсь

Процесс установки OgreSDK не отличаеться от других программ, за той лишь разницей что лучше ставить его в корне - так проще.

Создание нового проекта

Запускаем Visual Studio выбираем: File -> New -> Project или жмем клавиши: ctrl + shift + N.

Выбираем Visual C++ -> Win32 -> Win32 Project
* Называем свой проект в поле Name. Например : OgreApp
* Выбираем папку где будет храниться проект Location. Например H:\ogre\OgreApp
* Убираем галочку Create Directory for Solution
Нажимаем ОК.

Нажимаем Next, ставим галочку на Empy Project. Нажимаем Finish.

У нас создался пустой проект, теперь необходимо создать файл с кодом, для этого кликаем правой клавишой по папке Source Files и выбираем Add -> New Item
В появившемся окошке выбираем тип файла C++ File (*.cpp) зададим имя файла, например OgreAppSource, жмем кнопочку Add. Пока оставим файл пустым, затем здесь будет код нашего приложения.


Настройка проекта на использование Ogre3D

Сейчас нужно его настроить на использование движка Ogre3D, для этого щелкаем правой клавишой по названию проекта (OgreApp) и выбираем пункт Properties (самый последний пункт). Теперь настроим проект
Хотелось бы сразу уточнить, что настройки для разрабатываемой версии (Debug) в пункте Configuration и версии конечной (Release) будут немного различаться, пока будем работать только в Debug

Code
+ Configuration Properties

     General

         * Output Directory: $(OGRE_HOME)\bin\$(ConfigurationName)
         * Intermediate Directory: $(OGRE_HOME)\obj\$(ConfigurationName)

     Debugging

         * Command: $(OGRE_HOME)\bin\$(ConfigurationName)\$(TargetFileName)
         * Working Directory: $(OGRE_HOME)\bin\$(ConfigurationName)

     C++

         General

             * Additional Include Directories: ..\include;$(OGRE_HOME)\include;$(OGRE_HOME)\samples\include

         Linker

             General

                 * Additional Library Directories: "$(OGRE_HOME)\lib"

             Input

                 * Additional Dependencies: OgreMain_d.lib OIS_d.lib

                   Для версии Release используем: OgreMain.lib OIS.lib


Вот так выглядит окошко с настройками:

Использование шаблона

Теперь приступим непосредствено к программированию. Откроем файл *.cpp, который для примера мы назвали OgreAppSource,теперь возьмем простенький шаблон, чтобы упростить себе задачу и вставим его в проект

Code
#include "ExampleApplication.h"

class TutorialApplication : public ExampleApplication

{

protected:

public:

     TutorialApplication()

     {

     }

     ~TutorialApplication()

     {

     }

protected:

     void chooseSceneManager(void)

     {

         // Используем Terrain Менеджер Сцен (для использования карт высот)

         mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);

     }

     virtual void createCamera(void)

     {

         // Создаем класс камеры mCamera с именем PlayerCam

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

         // Установка позиции (вширь, вверх, вдаль) камеры

         mCamera->setPosition(Vector3(300,300,-550));

         // Установка позиции направление - куда смотрит камера

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

         // Настройка дистанции ближней и дальней прорисовки

         mCamera->setNearClipDistance(5);

         mCamera->setFarClipDistance(1000);

     }

     virtual void createViewports(void)

     {

         // Создание вьюпоинта или точки просмотра - с какой камеры выводить на экран. Цвет фона.

         Viewport* vp = mWindow->addViewport(mCamera);

         vp->setBackgroundColour(ColourValue(0,0,0));

         // AspectRatio — это отношение ширины области, на которую выводится изображение, к её высоте.

         mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));

     }

     void createScene(void)

         {

             // Описываем любой загружаемый объект

             Entity *ent;

             // Описываем любой создаваемый свет

             Light *light;

***В этой части будет находиться наш код***
         }

     };

     #if OGRE_PLATFORM == PLATFORM_WIN32 || 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

         TutorialApplication app;

         try {

         app.go();

         } catch(Exception& e) {

     #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32

         MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);

     #else

         fprintf(stderr, "An exception has occurred: %s\n",

             e.getFullDescription().c_str());

     #endif

         }

         return 0;

     }


После копирования шаблона можно приступать к программированию. Необходимо чтобы наш объект находился где то.. Прорисовывать все стороны света не нужно для этого есть свой инструмент. * SkyBox - Камера и объекты как бы находяться внутри большого куба, на плоскостях которого с внутренней стороны натянуты текстуры. Всего текстур 6. ( для тех кто делал карты в CS про Skybox объяснять не нужно smile )
* SkyDome - Почти SkyBox только закругленный сверху, а снизу без дна. ( Обязательно нужно ландшавт или что-то вроде него )
* SkyPlane - небо как панель: быстро рисуеться, но закрывать надо как низ, так и бока wink

Code

// Создаем космический SkyBox из примеров

mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
Теперь опишем общий свет применяемый в программе:

Code

// Общий свет, его цвет и тип используемых теней

mSceneMgr->setAmbientLight( ColourValue( 0, 0, 0 ) );

mSceneMgr->setShadowTechnique( SHADOWTYPE_STENCIL_ADDITIVE );
Теперь загрузим стандартную модель из Ogre:

Code

// Загрузка модели из файла RZR-002.mesh, который находиться в папке OgreSDK\media\models

ent = mSceneMgr->createEntity("model", "RZR-002.mesh");

// Наша модель отображает тень

ent->setCastShadows(true);

// Создаем node объект - объект, который в отличии от Entity можно изменять(размер, положение, поворот)

SceneNode *Nmodel = mSceneMgr->getRootSceneNode()->createChildSceneNode( "NmodelN" );

Nmodel->attachObject( ent );

// Увеличиваем модель в 4-ре раза на каждой оси

Nmodel->scale(4, 4, 4);

// Перемещаем нашу модель выше от центра

Nmodel->setPosition(Vector3(0, 55, 0));

// поворачиваем объект на 120 градусов (крутим вертикальную ось)

Nmodel->yaw(Degree(120));


Если вы хотите добавить свою модель используйте Экспорт в формат Ogre3D Добавляем источник света, для того чтобы все не было черным smile

Code

// Создание источника света с именем Light1

light = mSceneMgr->createLight("Light1");

// Тип нашего света - точечный

light->setType(Light::LT_POINT);

// Перемещаем наш источник света

light->setPosition(Vector3(0, 300, -250));

// Устанавливаем рассеевающий цвет

light->setDiffuseColour(.9, .9, .9);

// Устанавливаем отраженный цвет

light->setSpecularColour(.7, .7, .7);

Теперь нажимаем F5 - компилируем проект, выбираем необходимые параметры в окне настроек приложения Ogre3D и жмем OK. У нас должен получиться следующий результат:
Ну Вот собственно пока все. Можете скачать исходник OgreApp.
Автор этого замечательного примера не я, а ~Steep~ с сайта http://freestee.ru/

Комментариев нет:

Отправить комментарий