Pull to refresh

Основы Irrlicht Engine для новичков

Reading time 4 min
Views 21K
Хотелось бы рассказать о такой интересной вещи, как Irrlicht Engine. Для начала определимся что это вообще такое. Irrlicht — это мощный графический 3D движок, написанный на C++. Подходит сие чудо для разработки как простых 2D и 3D приложений, так и для игр. Как и любой другой движок, Irrlicht имеет ряд особенностей, основной из которых является платформенная независимость, то есть программисту, писавшему игру под Windows не нужно переписывать ни строчки кода, чтоб перенести её на устройство под управлением Linux или OSX.

Установка


Так как данный урок рассчитан на новичков, мы будем использовать простейший способ установки движка. Для этого нам понадобится code::blocks. Irrlich не очень хорошо дружит с последними версиями блокса, поэтому качаем отсюда и устанавливаем проверенную версию 10.05. Code::blocks уже содержит в своем установщике компилятор, поэтому качать его отдельно не нужно. Далее создаем на жестком диске папку, где будут храниться наши проекты (у меня «D:/IrrlichtDev»). Теперь качаем отсюда последнюю версию Irrlicht'а и разархивируем ее в созданный нами каталог.

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


Все необходимое у нас есть, настало время для создания проекта. Открываем Code:blocks, далее «File>New>Project», там выбираем «Irrlicht project». Следуя инструкции задаем имя нашему проекту, выбираем тот каталог для хранения, указываем в качестве компилятора «GNU GCC Compiler» и, если просит, говорим где находится движок.

Все, проект создан, минимальный код сгенерирован автоматически, но если попробовать скомпилировать его, то получим в ответ 2 ошибки. Ничего страшного, просто в 70 строке заменяем dimension2d на dimension2du. Компилируем, запускаем и видим прекрасную, низкополигональную женщину с примитивной анимацией.

Поздравляю, это ваш первый проект на движке Irrlicht. Давайте сотрем ненужные комментарии (мы же умные, мы и так все поймем) и оставим следующее:

#include <irrlicht.h>

using namespace irr;           //
using namespace core;          //  Здесь указываем пространства имен движка, для того, чтобы
using namespace scene;         //     не указывать их каждый раз, когда обращаемся
using namespace video;         //        к объекту движка.
using namespace io;            //
using namespace gui;           //

int main(int argc, char** argv)
{

    IrrlichtDevice *device =                                     // Здесь создаем ссылку на главный объект движка.
        createDevice(EDT_SOFTWARE, dimension2du(640, 480), 16,   // 1-й параметр - это рендер. Сейчас стоит программный 
            false, false, false, 0);                             // рендер,  но можно указать EDT_OPENGL, например.

    device->setWindowCaption(L"Hello HABRAHABR");      // Указываем заголовок нашего окошка.

    IVideoDriver* driver = device->getVideoDriver();    // Ссылки на видео драйвер и менеджер сцены.
    ISceneManager* smgr = device->getSceneManager();    // Подробнее о них можно почитать в документации.

    smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));  // Добавляем в менеджер сцены новую камеру.

    while(device->run())          // Это наш основной цикл. Он будет выполняться постоянно, пока работает движок.
    {
        driver->beginScene(true, true, SColor(0,200,200,200));      // Драйвер начинает отрисовку сцены.

        smgr->drawAll();                                            // Менеджер сцены рисует свои объекты.

        driver->endScene();                                         // Драйвер заканчивает отрисовку сцены.
    }

    device->drop();                                                 // Движок перестает работать, можно его удалить.

    return 0;
}




Сейчас на нашей сцене ничего нет кроме камеры, так что давайте добавим простой кубик. Для этого просто добавим следующую строчку:

IMeshSceneNode * wall = smgr->addCubeSceneNode();


Если запустим проект, то увидим, что наш кубик полностью черный. Это потому, что на сцене нет освещения.
Чтобы на него не распространялись законы физики, связанные с освещением, ниже добавим следующее:

wall->setMaterialFlag(EMF_LIGHTING,false);


Думаю не нужно объяснять содержание этой строки.
Чтобы наш рукотворный примитив не был незримо белым, наложим на него текстуру, которую возьмем в стандартном наборе движка. Ниже пишем следующее:

wall->setMaterialTexture(0, driver->getTexture("../../media/wall.jpg")); //Цифра "0" обозначает слой текстуры. 


Запускаем и видим красивый кусок стены.
Ну что это за кусок стены, если он не вращается? Значит далее пишем:

wall->setRotation(wall->getRotation() + vector3df(0,1,0));


Запускаем, проверяем.

Раз уж наш куб так истерично вращается, то поддержим психоделическую атмосферу неистово меняющимся цветом фона.
Создадим некую переменную "i", к которой каждый кадр будет прибавляться единица, а когда она будет достигать значения больше 256, будем сбрасывать её на ноль. Затем эту переменную укажем в качестве значения R, G и B цвета фона при отрисовке сцены. Таким образом, весь наш цикл while будет выглядеть так:

while(device->run())    {
        int i;
        i++;
        if (i>256) i=0;
        driver->beginScene(true, true, SColor(0,i,i,i));  // Здесь указывается цвет фона.

        wall->setRotation(wall->getRotation() + vector3df(0,1,0));

        smgr->drawAll();                                            

        driver->endScene();                                         
    }



Запускаем, наблюдаем.
Для ленивых вот полный исходный код урока:

#include <irrlicht.h>

using namespace irr;           //
using namespace core;          //  Здесь указываем пространства имен движка, дл того, чтобы
using namespace scene;         //     не указывать их каждый раз, когда обращаемся
using namespace video;         //        к объекту движка.
using namespace io;            //
using namespace gui;           //

int main(int argc, char** argv)
{

    IrrlichtDevice *device =                                     // Здесь создаем ссылку на главный объект движка.
        createDevice(EDT_OPENGL, dimension2du(640, 480), 16,   // 1-й параметр - это рендер. Сейчас стоит программный 
            false, false, false, 0);                             //  рендер, но можно указать EDT_OPENGL, например.

    device->setWindowCaption(L"Hello HABRAHABR");      // Указываем заголовок нашего окошка.

    IVideoDriver* driver = device->getVideoDriver();    // Ссылки на видео драйвер и менеджер сцены.
    ISceneManager* smgr = device->getSceneManager();    // Подробнее о них можно почитать в документации.

    smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));  // Дабавляем в менеджер сцены новую камеру.

    IMeshSceneNode * wall = smgr->addCubeSceneNode();
    wall->setMaterialFlag(EMF_LIGHTING,false);
    wall->setMaterialTexture(0, driver->getTexture("../../media/wall.jpg"));

    int i = 0;
    while(device->run())          // Это наш основной цикл. Он будет выполняться постоянно, пока работает движок.
    {
      
        i++;
        if (i>256) i=0;
        driver->beginScene(true, true, SColor(0,i,i,i));      // Драйвер начинает отрисовку сцены.

        wall->setRotation(wall->getRotation() + vector3df(0,1,0));

        smgr->drawAll();                                            // Менеджер сцены рисует свои объекты.

        driver->endScene();                                         // Драйвер заканчивает отрисовку сцены.
    }

    device->drop();                                                 // Движок перестает работать, можно его удалить.

    return 0;
}
Tags:
Hubs:
+9
Comments 9
Comments Comments 9

Articles