250 likes | 394 Views
Janne Laukkarinen 16.4.2008 Ohjelmistotuotanto ja tietokonepelit -seminaari, kevät 2008 Helsingin Yliopisto, Tietojenkäsittelytieteen laitos. Irrlicht Engine grafiikkamoottori. Johdanto. Pelimoottoreista Irrlicht Engine Ominaisuudet .NET-versio Arkkitehtuuri Esimerkkikoodia Yhteenveto.
E N D
Janne Laukkarinen 16.4.2008 Ohjelmistotuotanto ja tietokonepelit -seminaari, kevät 2008 Helsingin Yliopisto, Tietojenkäsittelytieteen laitos Irrlicht Engine grafiikkamoottori
Johdanto Pelimoottoreista Irrlicht Engine Ominaisuudet .NET-versio Arkkitehtuuri Esimerkkikoodia Yhteenveto
Pelimoottoreista Kaupallisia pelimoottoreita: Epic Games – Unreal Engine 3 id Software – id Tech 4 (entinen Doom 3 Engine) Valve Software – Source Engine Emergent Game Technologies – Gamebryo Avoimen lähdekoodin peli/grafiikkamoottoreita: id Tech 2, id Tech 3 Crystal Space OGRE 3D Irrlicht Engine
Pelimoottoreista Kaupalliset pelimoottorit eivät ole yleensä pelkkiä grafiikkamoottoreita Pelimoottori huolehtii grafiikan lisäksi muista osa-alueista: Ääni, musiikki Tekoäly, pelilogiikka Verkkoliikenne Fysiikka Kaupan päälle tulevat työkalut Karttaeditori Muun pelidatan editorit Muunnostyökalut (esim. 3ds Max-pluginit)
Pelimoottoreista Irrlicht Engine (kuten OGRE 3D) on pelkkä grafiikkamoottori (renderer), eikä riitä yksin pelintekoon Voidaan yhdistää muiden ilmaisten/avoimen lähdekoodin projektien kanssa peliprojektissa Ääni: IrrKlang (ilmainen ei-kaupallisissa projekteissa) FMod (ilmainen ei-kaupallisissa projekteissa) OpenAL (LGPL) Fysiikka: Newton (ilmainen) ODE (LGPL tai BSD) Bullet (zlib)
Irrlicht Engine Irrlicht = "virvatuli" Projektin aloitti Nikolaus Gebhardt vuonna 2002 Perustanut Ambiera-yrityksen Avoin lähdekoodi zlib-lisenssin alainen Uusin versio 1.4 (marraskuu 2007) Windows-, Linux- ja MacOS-alustoille
Irrlicht Engine: Ominaisuudet Alustariippumattomuus Helppokäyttöisyys Tehokkuus Näkymäverkon hallinta
Alustariippumattomuus Tukee Windows-, Linux- ja MacOS-alustoja Sovelluskehitintuki MS Visual Studio (6.0, .NET tai .NET Express Edition) Dev-C++, Code::Blocks ja Codewarrior Tuetut piirtorajapinnat: OpenGL (kaikilla alustoilla) DirectX 8.1 ja 9.0 (vain Windowsissa) Irrlicht Engine ohjelmistopohjainen rasteroija Apfelbaum ohjelmistopohjainen rasteroija Tuetut varjostinkielet: Pikseli- ja verteksivarjostimien versiot 1.1 – 3.0 ARB fragmentti- ja verteksiohjelmat HLSL GLSL
Alustariippumattomuus Kielikytkennät: Java: JIrr, Bindenlicht (viimeinen päivitys 2005) Python: Pyrr, Venom (kehitys lopetettu) Lua: IrrLua (viimeinen päivitys 2006) Ruby: IrrRuby (viimeinen päivitys 2005) Pascal: irrPascal .NET: Irrlicht.NET (kehitys lopetettu) ja Irrlicht .NET CP Irrlicht .NET CP (Cross Platform) Mono-projektin avulla .NET-ohjelmia voi ajaa myös Linux- ja MacOS-alustoilla Kaikki .NET-kielet käytössä (C#, VB.NET, Delphi.NET) Dokumentaatio heikkoa tällä hetkellä
Alustariippumattomuus Laaja tiedostoformaattituki Nopeuttaa pelinkehitystä Vähentää työvaiheita Riippumattomuus työkaluista Tuetut tekstuurien kuvaformaatit: .psd Adobe Photoshop .jpg JPEG .png Portable Network Graphics .tga Truevision Targa .bmp Windows Bitmap .pcx Zsoft Paintbrush Ei toistaiseksi tukea .dds-tekstuureille
Alustariippumattomuus Tuetut 3D-malliformaatit: .3ds 3D Studio .b3d Blitz3D .obj Alias Wavefront Maya .csm Cartography shop 4 .xml, .dae COLLADA .irr Irrlicht näkymät .irrmesh Irrlicht staattiset mallit .x Microsoft DirectX (binääri ja teksti) .ms3d Milkshape .mesh OGRE-mallit .bsp Quake 3 -kentät .md2 Quake 2 -mallit Ja joitain muita
Helppokäyttöisyys Kirjoitettu C++:lla ja puhtaasti oliopohjainen Hyvin suunnitellut rajapinnat API tarjoaa rajapinnat yleisesti tarvittaviin käsitteisiin Ohjelmoijan ei tarvitse osata matalan tason asioita Käytetty simulaatioiden/prototyyppien kehittämiseen "A major benefit is the well-designed interface and the ease of use of Irrlicht." – Ettlin, Büchler and Bleuler: A simulation environment for robot motion planning "The API wraps up complex concepts of computer graphics and presents the programmer with only a set of abstract classes with well-defined interfaces." – Triebel, Guthier and Effelsberg: Skype4Games "[Irrlicht] was chosen due to its very simple interface and easy to manage scene graph structure." – Wilczynski and Marasek: System for Creating Games in Augmented Environments
Tehokkuus Ei ole riippuvainen monista raskaista kirjastoista Optimoitu, nopea 3D-matematiikka ja kokoelmaluokat Käyttää 16-bittisiä tekstuureja oletuksena Noin kaksinkertainen siirto/piirtonopeus Polygonien määrää ei ole rajoitettu
Näkymäverkko Pelin maailmaa kutsutaan näkymäksi (Scene) Myös asetelma tai sommitelma Pelimaailman oliot ovat osa näkymää Näkymäverkko = näiden olioiden suhteet, ominaisuudet Jokaista pelimaailman oliota edustaa verkossa näkymäsolmu Verkko hierarkkinen, solmuilla voi olla lapsia
Näkymäverkon hallinta Irrlichtissä lapsisolmut liikkuvat suhteessa isänsä sijaintiin Helppo esimerkiksi kiinnittää valo liikkuvaan autoon Valmiita solmutyyppejä on Irrlichtissä useita Näkymäsolmu voi olla esimerkiksi Kamera Ulkokenttä Sisäkenttä Animoitu hahmo Animoitua vettä Ulko- ja sisäkenttiä voidaan yhdistää saumattomasti Ohjelmoija voi myös luoda omat solmutyyppinsä
Näkymäverkon hallinta Näkymäverkon hallinta tärkeä osa 3D-grafiikkamoottoria Tärkein tehtävä keventää rasteroijan (renderer) työtaakkaa rajaamalla sille tarjottavat oliot näkyviin tai mahdollisesti näkyviin (culling) Irrlichtin käyttämät erottelualgoritmit toimivat paremmin nykyisillä tehokkailla näytönohjaimilla
Arkkitehtuuri Nimiavaruudet irr – Juuri, kaikki Irrlichtin luokat ovat tämän nimiavaruuden sisällä irr::core – Sisältää perusluokat kuten vektorit, taulukot, listat jne irr::gui – Graafisen käyttöliittymän luomiseen käytetyt luokat irr::io – Tarjoaa IO-rajapinnat: tiedostojen luku ja kirjoitus, zip- ja xml-tiedostojen käsittely, jne irr::scene – Kaikki näkymänhallintaan liittyvä: 3D-Mallien lataus, näkymäsolmut kuten kasipuut (octree) ja billboardit, jne irr::scene::quake3 – Quake 3 -mallien käsittelyyn liittyvät luokat irr::video – Sisältää videoajurin käyttöön liittyvät luokat. Kaikki 2D- ja 3D-rasterointi tapahtuu täällä
Arkkitehtuuri Tärkeimmät luokat ja rajapinnat irr::IrrlichtDevice-luokka Irrlicht Enginen tärkein luokka ja moottorin juuri Luodaan ensimmäisenä ja tuhotaan viimeisenä IrrlichtDevice-olion kautta ohjelmoija pääsee käsiksi kaikkeen moottorissa irr::video::IVideoDriver-rajapinta 2D- ja 3D-rasterointi sekä tekstuurien manipulointi tapahtuu tämän rajapinnan kautta irr::scene::ISceneManager-luokka Hallitsee näkymäsolmuja, kameroita 3D-mallien lataaminen irr::scene::ISceneNode-rajapinta Kaikki näkymäsolmuina toimivat luokat toteuttavat tämän
Esimerkkejä C++ -kielinen esimerkki jossa Quake 2 -formaatin 3D-malli on animoitu ruudulla (ilman taustaa tai valaistusta) #include <irrlicht.h> using namespace irr; int main() { IrrlichtDevice *device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640,480),16,false,true,true); Edellä luodaan IrrlichtDevice-olio createDevice-funktiolla. video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* scenemgr = device->getSceneManager(); Talletetaan osoittimet videoajuriin ja näkymänhallintaan.
Esimerkkejä device->setWindowCaption(L"Hello World!"); Asetetaan ikkunan otsikkoteksti. scene::ISceneNode* node = scenemgr->addAnimatedMeshSceneNode( scenemgr->getMesh("quake2model.md2")); if (node) { node->setMaterialTexture(0, driver->getTexture("texture.bmp")); node->setMaterialFlag(video::EMF_LIGHTING, false); } Kun 3D-malli on ladattu, siihen lisätään tekstuuri ja asetetaan materiaalista valaistus pois päältä, sillä ilman erillistä valonlähdettä malli näyttäisi täysin pimeältä. scenemgr->addCameraSceneNodeFPS(0, 50, 100); Käyttäjä ohjaa kameraa FPS-tyyliin hiirellä ja näppäimistöllä.
Esimerkkejä while(device->run()) { driver->beginScene(true, true, video::SColor(255,0,0,255)); scenemgr->drawAll(); driver->endScene(); } Piirtäminen tapahtuu while-silmukan sisällä. Kaikki pitää piirtää beginScene- ja endScene-funktioiden kutsujen välissä. Funktio beginScene tyhjentää ruudun annetulla värillä. Näkymänhallinta piirtää sisältönsä ruudulle drawAll-kutsulla. Funktiota endScene kutsumalla kaikki esitetään ruudulla. device->drop(); return 0; } Irrlichtissä create-alkuisella funktiolla luodut oliot on vapautettava drop-funktiolla.
Yhteenveto Irrlicht Engine on Ilmainen ja avoin Saatavissa useammalle alustalle Integroitavissa muihin avoimiin/ilmaisiin projekteihin Käytettävissä myös muiden ohjelmointikielten kanssa Helpompi ja nopeampi oppia kuin monet muut moottorit Hyvin ja monipuolisesti dokumentoitu Oliopohjainen Tehokas ja nopea Monipuolinen ja laajennettava Yhä kehityksen alla
Yhteenveto Irrlicht Engine EI ole Kokonainen pelimoottori Valmis pelinkehitysympäristö Seuraavan sukupolven pelimoottori Aina ajan tasalla OGRE 3D:hen verrattuna Irrlicht on Helpompi oppia Yksinkertaisempi rakenteeltaan, arkkitehtuuriltaan Hieman heikommin dokumentoitu Tällä hetkellä jäljessä ominaisuuksien osalta Vähemmän tunnettu/suosittu