Irrlicht Engine logo

Tutoriál 1: HelloWorld
Přeložil: Martin Cmar

Tento tutoriál nám ukáže jak udělat jednoduchý program s využitím irrlicht enginu. Ukážeme si základni práci s vykreslováním grafiky- jak nahrát model a namapovat na něj texturu.
Výsledek bude vypadat takto:


Nastavení editoru ve kterém budeme pracovat

Pro používání enginu potřebujeme compileru říct kde se nachází hlavičkové soubory , nalezneme je v adresáři irrlich enginu složka \include. Aby compiler našel hlavičkové soubory, musíme specifikovat adresář ve kterém má hledat. V naší ukázce použijeme Microsoft Visual Studio C++ 6.0


  • Pokud používáte verzi 6.0, Jděte do menu Extras -> Options. Vyberte directories tab, a dále 'Include' (zde nastavujete složky ve kterých má kompiler hledat když přidáte nějaký hlavičkový soubor). Přidejte tedy složku include která je u enginu. Ted už compiler najde soubor Irrlicht.h. Potřebujeme však ale i soubor irrlicht.lib. Pro přidání do seznamu klikněte na 'Libraries' (čili to stejné jen přidáváte adresář pro knihovny) a přidejte složku \lib\VisualStudio kterou opět najdete u enginu.
      
     
  • Pokud je váš editor Visual Studio .NET, vyberte Tools -> Options. Klikněte na Projects entry a vyberte VC++ složky. Klikněte na 'show directories for include files'v kombo boxu, a přidejte \include složku do seznamu. Potřebujeme ale také irrlicht.lib. Klikneme tedy na 'show directories for Library files' a přidáme \lib\VisualStudio složku. Princip přidání je velice podobný předešlému příkladu.

 


Začínáme!

Po tom co vše nastavíme bude compiler vědět kde jsou hlavičkové soubory enginu. Přidáme je následujícím kodem.

#include <irrlicht.h>

V irrlich enginu, se všude vyskytuje slovo 'irr'. Tedy když budete chtít použít třídu enginu,tak napíšete 'irr' před jménem třídy. Například pro použití IrrlichtDevice, napíšete: irr::IrrlichtDevice. Aby jste se vyhnuli psaní irr:: před každou třídou, řekneme to compileru tímto příkazem.

using namespace irr;

Následuje 5 sub-namespaců. Pokud chcete detailní výpis/popis namespaců navštivte oficiální stránky 'Namespace list '(Bohužel v angličtině). Aby tento první tutoriál zůstal méně obtížným, nebudeme přesněji specifikovat funkci těchto řádků, a proto:

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

Abychom mohli používat irrlich DLL (knihovnu) potřebujeme odkaz na Irrlicht.lib. Pro přidání odkazu použijeme příkaz pragma comment:

#pragma comment(lib, "Irrlicht.lib")

Tak, teď jdeme na to hlavní. Celý chod programu se víceméně nachází mezi složenými závorkami funkce main().

int main()
{

Nejvíce důležitá funkce v enginu je 'createDevice'. S její pomocí není třeba tvořit složitou třídu okna, zda běží ve fullscreenu atd. Některé parametry jsou nepovinné, ale je lepší je uvést.
createDevice() má 7 parametrů:

  • deviceType: typ zařízení. Možnosti, kterými bude grafika zobrazena jsou tyto: softwarové zařízení, Direct3D8, Direct3D9, nebo OpenGL. V tomto případě použijeme EDT_SOFTWARE (softwarové zařízení), ale pokud chcete použít jiný, stačí EDT_SOFTWARE nahradit EDT_DIRECT3D8, EDT_DIRECT3D9, nebo EDT_OPENGL.
  • windowSize: Velikost okna. V našem případě použijeme velikost 512x384.
  • bits:Počet bitů na jeden pixel. Běžně 16 nebo 32.
  • fullscreen: Zadáváme zda chceme aby aplikace běžela ve fullscreenu či nikoliv. Možnosti jsou true - ano, false - ne.
  • stencilbuffer: Zadáváme zda chceme použít stencil buffer pro vykreslení stínů.
  • vsync: Určuje zda chcete použít vsnyc (nyní dále nespecifikováno). Pouze pokud jste použili fullscreen true.
  • eventReceiver: V našem příkladu tento parametr nevyužijeme, a nastavíme jej tedy na 0.
IrrlichtDevice *device =
createDevice(EDT_SOFTWARE, dimension2d<s32>(512, 384), 16,
false, false, false, 0);

Tak a ted nastavíme jako nadpis okna nějaký pěkný text. Kod začíná písmenem L. Za ním již následuje nadpis okna uzavřený v uvozovkách. Jak je již z kodu patrné, nadpis bude hello World! - Irrlicht engine Demo.

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

Nastavení ukazatelů na video driver, scene manažer a konečně i GUI - graphical user interface (má na svědomí vykreslování všech textů, tlačítek, kurzorů a dalších).

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

Vepíšeme do okna text použitím GUI prostředí. Text má pozici (10,10) levý horního roh a (200,22) pravý dolní roh.

guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!",
rect<int>(10,10,200,22), true);

Pro zobrazení něčeho zajímavého, nahrajeme a vykreslíme model z quaka 2. Aby jsme mohli s modelem pracovat musíme ho nejdříve nahrát. Provedeme to pomocí getMesh(). Pro zobrazení modelu použijeme addAnimatedMeshSceneNode(). Protože se jedná o animovaný model, obsahuje volání funkce slovo animated, kdyby jste si přáli nahrát statický model, stačí funkci zaměnit za addMeshSceneNode(). Místo nahrávání Quake2 modelů (.md2), můžeme použít také Maya object (.obj), kompletní Quake 3 mapu(.bsp), nebo soubor Milshape (.ms3d) .

poznámka: když překládám tento článek existuje už i beta verze 1.4 která podporuje ještě mnoho dalších typů. Pro kompletní výpis navštivte sekci Vlastnosti.

Nahrávaný model se jmenuje sydney.md2 a byl vymodelován Brian Collinsem.

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

Aby jsme udělali model více hezčí, změníme jeho materiál. Vypneme světlo protože nemáme žádné vytvořeno a tudíž by byl model celý černý. Dále vytvoříme smyčku která zajistí že se model bude animovat pořád dokola od snímku 0 až 310. Jako poslední aplikujeme texturu na model.

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

Abychom viděli model, musíme nastavit pozici kamery směrem na model (0, 10, -40). Kamera je natočena od její pozice směrem k (0,5,0). První vector3df tedy určuje samotnou pozici kamery a druhý vector pak její natočení.

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

Ok.Nyní máme nastavenou scénu, jdeme tedy na samotné vykreslení: přidáme podmínku while() která zjistí zda jsme již vytvořili device(createDevie()) a dále spustí následující blok příkazů.

while(device->run())
{

Všechno musí být vykresleno mezi beginScene() a endScene(). Scéna začne, dále se vše vykreslí a scéna se ukončí (scénu je třeba ukončit pokaždé kvůli paměti. kdyby jste tuto funkci vynechali, náš program by se po určité době zastavil právě z nedostatku paměti). Parametr Scolor() určuje barvu pozadí. Čím větší číslo tím světlejší a naopak (255-bílá, 0-černá).

	driver->beginScene(true, true, SColor(255,100,101,140));
smgr->drawAll(); guienv->drawAll();
	driver->endScene();

}

Pokud neproběhne první podmínka v programu (createDevice) správně, program se ukončí.

	device->drop();
return 0; }

Zkompilujte a spust'te

 

 


Kopírování obsahu bez souhlasu autorů je zakázáno.
Copyright 2007 Irrlicht3d.cz