Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Irrlicht. Начало.


Автор: Dronchik 17.6.2008, 16:21
Irrlicht. Начало.

Эта статья об одном из лучших бесплатных игровых движков Irrlicht. Офф сайт irrlicht.sourceforge.net . Начнём с описания движка. Irrlicht это 3D-графический объектно-ориентированый движок. Работает под операционными системами Windows 95, 98, NT, 2000, XP, Linux и MacOS. Движок для рендеринга использует графические библиотеки DirectX8.1, DirectX9, OpenGL 1.5. Движок работает с языками программирования C++, C#, Visual Basic и Delphi(пока в разработке). Теперь переходим  работе с движком. 
    Для начала мы должны создать консольный проект и подключить к нему библиотеку irrlicht.lib. После этого в нашем исходнике мы должны подключить заголовочный файл irrlicht.h. 
Код

#include <irrlicht.h>

Для удобства все заголовочные файлы движка можно поместить в папку include Вашего компилятора, и библиотеки из папки Lib в папку с библиотеками Вашего компилятора. 
Всё в движке находиться в пространстве имён irr. Поэтому его мы и подключим.
Код

using namespace irr;

Также в этом пространстве есть подпространства отвечающие каждая за свои объекты, функции, типы данных. Мы их также подключим. Подробнее об этих пространствах имён можно почитать в документации.
Код

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

Дальше мы начинаем работу в нашей главной функции main. Для начала мы должны создать графическое устройство:
Код

void main{
IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d<s32>(1024, 768),
            16, false, false, false, 0);

У функции createDevice 7 параметров. Первый это используемый рендер. На данный момент доступны Null device(EDT_NULL), Software device(EDT_SOFTWARE), DirectX8(EDT_DIRECTX8),  DirectX9.0c(EDT_DIRECTX9) и OpenGL(EDT_OPENGL). Второй параметр это размер экрана или иными словами разрешение. Третий параметр это количество цветов. Четвёртый параметр определяет будет ли у нас полноэкранный режим или нет. Пятый параметр отвечает за использование Стенсил буфера. Шестой параметр игнорируется при оконном режиме. Это параметр определяет будет ли FPS синхронизироваться с частотой обновления экрана. И последний параметр это объект для обработки событий. На данном этапе он нам не нужен, поэтому ставим ноль. 
Теперь мы установим заголовок окна.
Код

device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");

Теперь необходимо получить указатель на видео-драйвер, менеджер сцены и графический интерфейс. Это мы делаем для того чтобы постоянно не писать device->getVideoDriver(), device->getSceneManager() и device->getGUIEnvironment().
Код

IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();

Теперь мы добавим в нашу сцену 3D модель и нарисуем её. Это будет Sydney.md2 (стандартная модель для движка из папки media). От менеджера сцены мы должны получить указатель на объект(getMesh())  и прикрепить к SceneNode для того чтоб можно было отобразить модель на экран (addAnimatedMeshSceneNode()). Кроме моделей формата md2 Irrlicht умеет загружать большинство распространенных форматов включая .x, .obj, .ms3d и другие.
Код

IAnimatedMesh* mesh = smgr->getMesh("media/sydney.md2");
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);

Далее для корректного и красивого отображения модели мы сделаем чтоб наша модель как бы освещалась со всех сторон(setMaterialFlag(EMF_LIGHTING, false)), заставим нашу модель двигаться(setFrameLoop(0, 310)) и натянем текстуру на нашу модель(setMaterialTexture(0, driver->getTexture("media/sydney.bmp")).
Код

if (node)
{
node->setMaterialFlag(EMF_LIGHTING, false);
node->setFrameLoop(0, 310);
node->setMaterialTexture( 0, driver->getTexture("media/sydney.bmp") );
}

Стандартно при загрузке модель устанавливается в позиции X=0, Y=0, Z=0. Чтобы изменить позицию модели нужно воспользоваться функцией setPosition(core::vector3df(int x, int y,int z)); 
Далее чтобы увидеть наш объект мы должны установить камеру в позицию (0, 10, -40). C этого места камера будет смотреть в точку (0,5,0).
Код

smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

Теперь мы должны всё нарисовать. Это всё происходит в цикле программы, который будет работать до тех пор пока мы не закроем нашу программу.
Код

while(device->run())
{  

Всё прорисовывается между командами beginScene() и endScene(). Для прорисовки используется функция drawAll();
Код

driver->beginScene(true, true, SColor(0,200,200,200));//о параметрах функции можно прочитать в документации
smgr->drawAll();
driver->endScene();
} 

После работы программы следует очищать “загаженную” память. Это мы делаем функцией drop().
Код

device->drop();
 return 0;
}

Компилируйте и наслаждайтесь.

Андрей Ольшевский aka Dronchik




Автор: CppDevelopeR 17.6.2008, 16:24
Респект

Автор: Graf_h 17.6.2008, 16:41
Dron4ik я также обратил внимание на этот движок! Так что ждем побольше статей! smile  smile 

Автор: Dronchik 17.6.2008, 16:56
Graf_h, ок, статьи будут!

Автор: THandle 19.6.2008, 00:30
Dronchik, молодец, продолжай в том же духе. Получай заслуженный +1 в репу smile 

Автор: Dronchik 19.6.2008, 05:13
THandle, спасибо! smile 

Автор: nerezus 21.6.2008, 18:19
А можно пару скриншотов с КРАСИВОЙ графикой и пару примеров игр с КРАСИВОЙ графикой на этом движке?

Просто почему же его не используют? Неужели не проще дописать к нему пару фишек, чем написать с нуля?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)