predmet seminar ogre3d - carnetov portal za...
TRANSCRIPT
1
Fakultet elektrotehnike i računarstva Sveučilište u Zagrebu
Danijel Pobi
Predmet Seminar
Ogre3D
kolovoz, 2011.
2
Sadržaj:
1. Uvod ...........................................................................................3
2. Uvodno o Ogre-u ........................................................................4
3. Uvodni koraci programiranja s Ogre-om ....................................8
4. Pregled dizajna Ogre-a ..............................................................12
5. Korištenje Ogre-a ......................................................................19
a. Inicijalizacija .....................................................................19
b. upravljanje scenom ..........................................................21
c. materijali .........................................................................25
d. animacije ..........................................................................29
6. Alati ...........................................................................................33
7. Zaključak....................................................................................36
8. Literatura ..................................................................................36
3
1. Uvod
Cilj ovog seminara je opisati osnovno rad i korištenje Ogre sustava
iscrtavanja. Zašto je preciznije redi sustav iscrtavanja a ne Ogre engine bit de
objašnjeno odmah u uvodu o Ogre-u. Nadalje pokušat du objasniti zašto je Ogre
postao toliko popularan naspram drugih sustava i zašto je jedan od najviše
korištenih open source sustava kad je riječ o programiranju grafičkih aplikacija.
Ukratko du objasniti osnovne značajke i po čemu je Ogre tako poseban naspram
drugih. Nakon toga dolazi najduže poglavlje, osnove korištenja Ogre-a i
njegovih najvažnijih dijelova. Za kraj seminara sljedit de kratki pregled nekih
dostupnih alata i dodataka za neke popularnije programske pakete koji se
odnose na Ogre.
4
2. Uvodno o Ogre-u
Ogre ili Object Oriented graphics rendering engine (objektno orijentirani
grafičko iscrtavački sustav) je točno to što njegovo ime govori, sustav za
iscrtavanje grafike u realnom vremenu. Najčešde se zove i Ogre 3D jer se radi o
trodimenzionalnoj grafici. Iako se može koristiti za 2D grafiku, zbog nedostatka
optimizacije nije prikladan, jer u pozadini radi sve u 3D-u, ali preko billboarda i
time zauzima znatno više resursa nego da se koristi neki 2D engine. Engine (ili
na Hrvatskom pokretački sustav) je zato što upravo služi da pogoni 3D aplikaciju
bez da se programer zamara previše s detaljima iscrtavanja, a više posveti
samom sadržaju aplikacije koja se radi. S relativno malo koda Ogre se
inicijalizira i pokrene sve potrebne stvari da bi se dogodilo samo iscrtavanje.
Ogre pod svojim „poklopcem“ ima implementiran sustav koji inicijalizira i
pokrene sve potrebno za odabrani API iscrtavanja (Directx ili OpenGL) koju su
implementirani u obliku plugin-a, ali o tome više kasnije. Ogre3D je obijektno
orijentiran u tom smislu da je dizajniran tako da sve gleda kao kolekciju
objekata koji međusobno surađuju, a ne kao sekvenca diskretnih zadataka.
Tipična simulacijska arhitektura uobičajeno korištena u igrama je prikazana
doljnjim dijagramom gdje je računalno sklopovlje apstraktirano aplikacijskim
slojem, a igračka/simulacijska logika koristi sustave aplikacijskog sloja za
vrijeme (Timer), pristup kontrolama(HID=Human interface diveces, hrv. uređaji
ljudskog sučelja) i pristup datotekama(File System).
Mreža Video
Aplikacijski Sloj
HID
Zvuk
Simulacijska Logika
Timer File System
5
Logički sloj sadrži pravila simulacije i održava simulacijska stanja, dijeluje na
unos dobiven iz aplikacijskog sloja i mrežnog sloja. Sva stanja se periodično
prezentiraju korisniku preko audio-vizualnog „pogleda“ na stanja. U ovom
prikazu Ogre3D je samo Video sloj, jer samo to i radi. Ne rukuje s unosom
korisnika, nema sustav rukovanja stanjima u igri, nema komunikaciju s mrežom,
ne svira nikakve zvukove itd.
Po dizajnu Ogre3D je samo biblioteka za iscrtavanje i to je jedina zadada koju
dobro obavlja. Ogre3D nije game engine baš zbog tih razloga. Da bi bio game
engine (poput XNA, Unreal, Unity, Tourqe,...), mora u svojoj jezgri sadržavati
podršku za mrežnu komunikaciju, ulaz-izlaz, zvuk, imati niz službenih alata, itd.
Te sve funkcionalnosti su na samom programeru da implementira po svojim
potrebama ili potraži neke druge biblioteke koje de koristiti uz Ogre3D (poput
OpenAL za zvuk, OIS biblioteka za korisničko sučelje, itd).
Na kraju ovog poglavlja, mali pregled značajki zbog kojih se Ogre3D toliko
koristi:
Puna i jednaka podrška za OpenGL i DirectX
o sadrži i mobilne verzije OpenGl ES 1 i 2 (korisno za mobilne
aplikacije u iOS i Android)
o Mobile DirectX nikad nije u potpunosti zaživio, ali radi dijelom
Puna podrška za mnogo operativnih sustava
o na računalima Windows, Linux i Mac OS X
o mobilni operativni sustavi iOS i Android
Jednostavan framework koji se jednostavno integrira u bilo koju
postojedu aplikaciju
Automatsko rukovanje iscrtavačkog sustavnog managmenta i hijerarhijski
culling
Modan i sofisticiran skriptni sustav koji omogudava da se neke stvari
mijenjaju i održavaju bez da se dotakne ijedna linija koda programa
Podrška za sve texturalne i blending tehnike, kao i podrška za GPU
tehnike i sve visoko stupanjske i asemblerske shading jezike poput Cg,
HLSL i GLSL
Podrška za širok niz formata slika i textura (png, tga, dds, tif, gif, jpg...)
Puna podrška za materijalne nivoe detalja
6
Optimiziran binarni mesh format sa manualnim i automatskim
generacijama nivoa detalja
Potpun pristup indeks spremnicima, deklaracijama vertexa (vrhova) i
spremnika mapiranja
Exporteri za vedinu alata za 3D modeliranje (npr. 3DS Max, Blender,...)
Puna podrška za skeletalnu i pose (vertex) animaciju i sofisticirano
blendiranje bilo kojeg broja višestrukih težina po vertexu
Podrška za sklopovsko i programsko ubrzani skinning
Hijerarhija je plug-in bazirana, čime se omoguduje da u zadanom
trenutku odaberemo najpogodniji hijerarhijski manager
Puna podrška za nekoliko tehnika sjenčanja (stencil, texture, additive,
modulative) i sve s punom podrškom za sklopovsko ubrzanje
Napredni čestični sustav
Jednostavno korištenje i podrška za tehnike iscrtavnja neba (skybox,
skyplane, skydome)
Automatsko upravljanje prozirnosti objekta
Podrška za file system, ZIP i PK3 arhivne tipove
Lista se može još protezati, ali mislim da nema smisla nabrajati baš sve
mogudnosti koje su uključene.
Ogre3D je projekt otvorenog tipa (open source), što znači da su svi njegovi
dijelovi besplatni za korištenje i korisnik čak može raditi izmjene na njemu po
potrebi. Pokrenut je 2001. godine kad je idejni začetnik Steve „Sinbad“
Steerting imao ideju da treba još jedan sustav isctavanja koji bi trebao biti
neovisan o strukturi scene. Tijekom godina, ovo nije projekt na kojem je radilo
mnogo ljudi (ukupno tijekom zadnjih 10 godina je radilo na ovome oko 20
programera, a jedino osnivač stalno) i nije komercijalan, što znači da tko god je
radio na ovome bilo je u svoje slobodno vrijeme i bez ikakvih naknada (blago
rečeno nije nikome ništa plačeno). Biti u ekipi koja radi na razvoju Ogre3D-a je
više stvar prestiža nego išta drugo.
Iako glavni jezik za korištenje Ogre3D-a je C++, ima nekoliko uspješnih
projekata gdje su se napravili „wraperi“ oko Ogre API-ja da se podrže jezici C#,
Java, Python, Ruby, itd. Ipak ti pokušaji nisu dio službenog Ogre-a i samim time
su u raznim stadijima stabilnosti i završenosti. Ogre se razvija i održava koristedi
7
ISO C++ standard i kompatibilnost s bilo kojim drugim jezikom nije ni u
razmatranju Ogre razvojnog tima. Time da bi se Ogre iskoristio u potpunosti,
potrebno je poznavati C++ i opdenito razumijeti obijektno-orijentiranu
paradigmu. Bez ovoga razumijeti Ogre bi bilo kao pokušavati shvatiti strani jezik
bez ikakvog razumjevanja pravila ili semantike jezika. Naravno, potrebno je
znati i kako raditi programe koristedi SDK i razvojnu okolinu. Uz to bit de
potrebno i osnovno poznavanje 3D grafike i osvjetljenja.
8
3. Uvodni koraci programiranja s Ogre-om
U originalu razvoj Ogre-a je počeo na 32-bitnoj Windows platformi, koja je
još uvijek glavna platforma za razvoj Ogre-a. To ne znači da su ostale platforme
zanemarene. Ogre ima nativnu podršku za OpenGL što znači da ga je mogude
koristiti na bilo kojem operativnom sustavu s OpenGL sklopovljem, iako
službeno nisu direktno podržane ne-Linux UNIX platforme. Ogre je bio uspješno
portan na Pocket-PC računala (Windows CE), ali s jako ograničenom
funkcionalnošdu. Danas, zahvaljujudi OpenGL ES podršci Ogre bez problema
radi na iOS i Android uređajima. Ima čak i uspješnih portanja na konzole poput
Xbox-a što i nije iznenađujude jer je u jezgri Xbox-a windows, a API je DirectX,
ali postojanje porta nije službeno zbog mogudih pravnih problema.
Poanta je da Ogre-ov dizajn odvaja logiku od platforme i omogudava direktno
i modularno dodavanje podrške za različito sklopovlje i operativne sustave.
Korišteni C++ jezik prati moderni ISO C++ standard, što znači da bi se s malo
truda trebalo portati na službeno nepodržanu platformu i bez nekog truda iz
prve raditi na podržanoj platformi.
Vedina programskih sistema je ovisna o drugim programima i SDK-ima za
vanjsku funkcionalnost. To omogudava sistemu da balansira s postojedom,
zajedničkom funkcionalnosti bez da se dupliciraju neki radovi i omogudava
projektantskom timu da se fokusira na specijalizirane detalje svog programa.
Ogre nema mnogo biblioteka o kojima je ovisan. Ipak ima minimalan, dobro
isplaniran i besplatan (što znači da je uključen u Ogre SDK) set biblioteka za
razne funkcionalnosti. To su:
FreeType za management fonta i renderiranje (www.freetype.org)
OpenIL (DevIL) što je biblioteka za manipulaciju slika (kompajliran
s više biblioteka da se objedini podrška za najčešde formate slika
poput jpeg,png,tiff,mng,...) (http://openil.sourceforge.net)
zziplib i zlib koje služe za kompresiju i upravljanje ZIP datotekama
To je što se tiče biblioteka koje su univerzalne za sve operativne sustave. Na
windowsima Ogre Direct3D podsistem zahtjeva da se ima instaliran DirectX
Runtime (koji je ionako dio svih novijih windowsa) ili ako se builda Ogre iz
9
izvornog koda, treba biti instaliran DirectX SDK. Ogre podržava HLSL i GLSL GPU
jezike sjenčanja i hardverski neovisan Cg API (Cg nije ovisan samo o NVIDIA
grafičkim čipovima, potrebne biblioteke dolaze u paketu s Ogre SDK).
Za programirati s Ogre-om je najbolje preuzeti ved kompajlirani Ogre SDK, jer
raditi s source kodom je dosta komplicirano i ne preporučuje se osim ako
nedete raditi izmjene na njemu. Ved kopmajlirani SDK je optimiziran i dovoljan
za 99% korisnika Ogre-a. Za naprednije korisnike koji žele skinuti izvorni kod a
to je mogude napraviti skidanjem s službenog SVN-a više verzija. Na SVN-u se
nalaze uz starije verzije dvije aktualne verzije, a to su stabilna koja se koristi za
izradu SDK-a i nestabilna verzija koja je trenutna verzija u razvoju.
Pokazat du na primjeru Visual Studia kako se Ogre instalira i sprema za
korištenje. Instalacija OgreSDK u verziji 1.7 na više je puno lakša nego prije i
sastoji se od 3 koraka:
1. Skidanje OgreSDK s interneta. Sve što je potrebno je odabrati verziju s
obzirom na verziju IDE-a koji se koristi:
download OgreSDK sa www.ogre3d.org/download/sdk
10
2. Otpakirati Preuzeti paket na željenu lokaciju
ekstraktiranje OgreSDK
3. Postavljanje OGRE_HOME enviroment varijable, koja koristi da bi se
pokazala lokacija Ogre direktorija. To se jednostavno napravi pomodu
komandne linije (setx komanda za Win 7/Vista, a set za win xp)
postavljanje enviroment varijable
Sljedede sad, samo radi provjere da je sve dobro instalirano, može se buildati
i pokrenuti „Sample browser“ set primjera koji dolazi s Ogre-om. Sam Visual
Studio projekt se nalazi u direktoriju OgreSDK-a pod imenom „OGRE“. Ako je
sve uspješno, buildanjem i pokretanjem bi trebali dobiti u konadnosti ovaj
prozor:
11
Ogre Sample Browser
Od ostalih razvojnih okolina, samo du spomenuti da postoje ved spremni SDK-
ovi za brzu integraciju u Xcode na Mac računalima, MinGW i paketi za Ubuntu
PPA. Za sva ostala razvojna okruženja trenutno jedino riješenje je buildati
source kod prema potrebi.
12
4. Pregled dizajna Ogre-a
Brzim pregledom na listu klasa i metoda Ogre-a može se vidjeti koliko je Ogre
opsežan i kompliciran. Sredom Ogre je obijektno orijentirana biblioteka klasa i
njegov sofisticirani hijerarhijski dizajn omoguduje da se s njim radi na puno
jednostavnijoj bazi samo onoga što je potrebno (mogude je napraviti aplikaciju
s Ogre-om u nekih stotinjak linija koda). Ogre pruža objektno orijentirane
metode pristupa obradi proceduralnih podataka i time iscrtavanje jednostavnih
geometrijskih primitiva na metu iscrtavanja (međuspremnik ekrana koji se
prikazuje na ekranu). Uobičajno kad se koristi OpenGL ili Direct3D za iscrtavanje
objekata treba pratiti niz koraka proceduralnog toka rada, drugim riječima
postaviti niz stanja iscrtavanja pozivima API-u, poslati razna geometrijska stanja
s mnogim pozivima API-a i redi API-u i GPU-u da iscrtavaju s drugim pozivima
API-ja. S objektno orijentiranim pristupom u iscrtavanju geometrije nema
potrebe da se koristi čista geometrija nego je potpuno maknuta i time sve što je
potrebno napraviti je definirati pokretne objekte, statične objekte koji čine
geometriju svijeta, svijetla, kameru i sve što je potrebno. Nema poziva API-u,
nego se samo stave objekti u scenu, a Ogre se brine o svemu ostalom. Tako se
može manipulirati scenom intuitivnijim metodama nego da se koriste čiste
transformacijske matrice. Sustav renderiranja apstraktira korišteni API (OpenGL
i DirectX) u jedinstveno sučelje do njihove funkcionalnosti. Funkcionalnost grafa
scene je apstraktirana u drugom sučelju tako da se mogu razne implementacije
grafa scene jednostavno korisiti. Na sličan način je mnogo stvari apstraktirano
poput objekata za iscrtavanje bili oni statični ili pomični.
Graf scene je odvojen od sadržaja scene i to je jedna od najbriljantnijih, ali i
ujedno najmanje cijenjih mogudnosti u dizajnu Ogre-a. Tradicionalne metode
spajaju sadržaj scene i graf scene u hijerarhiju koja prisiljava podklasiranje
sadržajnih klasa u čvorove grafa scene, što je u dosta slučajeva loš dizajn jer ne
dozvoljava izmjenu algoritma grafa scene bez da se prave promjene sa svim
dijelovima hijerarhije. Ogre s grafom scene postupa na razini sučelja, bez
pretpostavke i znanja kakav algoritam grafa scene je implementiran. Sučelje
grafa scene jedino brine o strukturi grafa. Čvorovi nemaju nikakvu ulogu
upravljanja, nego Ogre to pritisde dolje u ono što zove „renderable“ (iscrtljivo?)
13
iz čega se svi dijelovi geometrije scene stvaraju. Svojstva iscrtavanja (također
zvana materijali „materials“) za ove iscrtljive objekte se sadrže u Entity objektu
koji sadrži SubEntity objekt. Ovi SubEntity objekti su u biti iscrtljivi objekti. Da bi
se to lakše razumilo, ovdje je slika relacija grafa scene i sadržaja:
Sva geometrija i svojstva iscrtavanja su pristupačna grafu scene preko
MovableObject sučelja. Ogre omogudava korisniku da na čvor scene poveže
korisnički definiranu kontrolu poput dodataka za audio i sl. Ništa se ne treba
apstraktirati, samo se stvori jednostavno sučelje koje de graf scene prepoznati
da bi se moglo na njega nadovezati.
Plug-In Arhitektura je također jedna od glavnih značajki Ogre-a. Ogre
korisniku ne forsira određen API iscrtavanja, nego svaki API je upakiran kao
plugin za ogre da korisnik može odabrati šta mu najviše odgovara. Ne radi se
samo o API-u iscrtavanja, nego graf scene je sučelje i svaka implementacija
14
algoritma grafa scene je jedan plugin koji se može i tijekom izvođenja zamjeniti
ovisno o željenoj primjeni. Primjer je da imamo scenu u zatvorenom i tu nam
treba graf scene koji je dobar za zatvorne prostore, a kad izađemo iz
zatvorenog prostora na otvoreno, treba nam implementacija za velike prostore.
Glavna prednost plug-in arhitekture je da se ne moraju Ogre biblioteke
ponovno bildati da bi novi plug-inovi radili. Plug-inovi se jednostavno učitavaju
tijekom izvršavanja programa tako da se samo definira o kojoj vrsti plugina se
radi i koja mu je namjena.
Sklopovski podržano ubrzanje iscrtavanja je podržano u osnovici i
programsko ubrzanje nije opcija, tako da Ogre zahtjeva grafički procesor koji
podržava bilo koji od podržanih API-a. To omoguduje Ogre-u da slobodno radi
u otimiziranom modu s sklopovskim međuspremnicima (memorija dijeljena
između grafičkog sklopovlja i aplikacije). Time se mogu u potpunosti iskoristiti
napredna sklopovska ubrzanja uključujudi programibilne shadere. Ovakva
razina integracije programibilnog grafičkog cijevovoda (graphics pipline) i Ogrea
stavlja Ogre u poziciju gdje je usporediv s mnogim komercijalnim 3D sustavima
poput Unreal Enginea ili CryENGINE-a. Iako neke napredne stvari (poput
globalnog osvijetljenja Ambient Occlusion) ostaju na programeru da
implementira, ali pošto se ionako vedina toga radi „offline“, tj. ne u realnom
vremenu, to i nije neki nedostatak. Trenutno su podržanani Direct3D (do verzije
9 u potpunosti, verzija 10 je preskočena i samo nekoliko malih stvari je
implementirano, a sad se radi na verziji 11, dok mobile DirectX nikad nije
službeno napravljen) i OpenGL (do verzije 4 i OpenGL ES verzije 1 i 2).
Fleksibilni red iscrtavanja je napravljen da bi se lakše iscrtavali dijelovi scene.
Standardni proces iscrtavanja tipično ide ovako: terena i/ili geometrije svijeta,
pokretni obijekti, efekti, overlayi, zatim pozadina i/ili nebo. U ovakvoj tipičnoj
implementaciji teško je promjeniti redosljed iscrtavanja i to ponekad rezultira
kodom koji je teško održavati i ima nefleksibilan dizajn. Ogre tu nefleksibilnost
riješava uvođenjem redova iscrtavanja. Ogre jednostavno iscrtava sadržaj kako
je u redu. Sljededa slika pokazuje redosljed iscrtavanja gdje se stvari s manjim
prioritetom prvo iscrtaju tako da budu u pozadini (npr. sama pozadina scene),
dok stvari s velikim prioritetom se zadnje iscrtavaju i najčešde su najbliže (npr.
HUD=heds up display s trenutnim rezultatima ili izbornik aplikacije).
15
Prednost u fleksibilnosti ovakvog dizajna je što korisnik može promjeniti
prioritete iscrtavanja kako mu odgovara u određenom trenutku ili cijeli red
jednostavno isključiti.
Robustan sustav materijala omoguduje da se promjene unutar scene
naprave bez da se takne linija koda. Ogre sadrži skripte materijala koje se
sastoje od jedne ili više tehniques (tehnika) koje su kolekcija pass-ova (prolaza).
Pass se odnosi na prolaz iscrtavanja, a to je jedinica po kojoj se materijal
iscrtava unutar Ogre-a. Može se imati koliko se hode prolaza, ali treba paziti jer
svaki prolaz uzrokuje sasvim novu operaciju iscrtavanja (čim više prolaza, sporiji
rad). To uzrokuje pad performansi, ali ponekad je to jedino riješenje da se
dobije željeni efekt. Najbolja stvar ovog sustava je nastavak u slučaju pogreške,
gdje se od nabrojanih tehnika, automatski odabire teknika koja je podržana s
trenutnim sklopovljem. Drugim riječima sustav de pretragom prema dolje
odabrati koja tehnika mu najbolje odgovara. Također unutar skripte je podrža
shema (schemes) skripte, koju je najbolje opisati kao nivo detalja na razini
materijala (npr. napraviti shemu koja de koristiti tehnike samo podržane na
novim grafičkim karticama, dok imati i shemu sa jednostavnim efektima za
stare grafičke). Iako je i materijale mogude definirati u samom kodu, ovo je
mnogo elegantnije jer se izmjenama ne mora ponovno kompajlirati cijeli kod i
time se rastavlja stvaranje sadržaja aplikacije s samim radom aplikacije.
Optimizirani geometrijski i kosturski format je korišten za Ogre-ov sustav
„*.mesh“ i „*. skeleton“ podatke. To je binarni prikaz podataka (znači ne mogu
se vidjeti čisti podaci o vrhovima ili bilo čemu ostalom u tekstualnom editoru) i
16
kao rezultat toga Ogre podržava samo takav format modela koji je dosta
efikasan u učitavanju. To je zbog ved unaprijed optimiziranog izgleda binarnih
datoteka u eksporteru koji ih je napravio. Više o eksportanju modela u zadnjem
poglavlju o alatima. Optimiziranje binarnog formata je primarno u redovanju
vrhova poligona, geometrije i podataka kostiju, ali i u pravljenju nivoa detalja i
kreiranju tangenti za mreže poligona. Generiranje ovoga prije korištenja uklanja
potrebu da se generiraju tijekom izvođenja programa, čime se smanjuje
vrijeme učitavanja potrebnog objekta.
Višestruki tipovi animacija podržani u Ogre-u su: skeletal (kosturska), morph
(izobličenje) i pose (poze). Skeletalna animacija se odnosi na spajanje vrhova
na kosti u kosturu i popularno se naziva skinning (guljenje kože?). Na svaki vrh
može utjecati do 4 nezavisne kosti s određenim težinskim faktorom. Ovo je
korisno za prikazivanje realističnih deformacija vrhova npr. u aproksimaciji
pokreta ljudskog tijela gdje efekt pomicanja ruke ima utjecaj na deformaciju
mišida na ramenu. Skeletalna animacija je podržana keyframingom i tipično
Ogre exporteri je generiraju tijekom eksportiranja iz modelerskog alata. Morph
animacija je animacijska tehnika na razini vrhova gdje se spremaju apsolutne
lokacije vrhova (početne i krajnje) i interpolira između zadanih pozizcija tijekom
izvođenja programa. Razlikuje se naspram pose animacije po tome da sprema
odmake vrhova umjesto aplosultne pozicije i time se višestruke pose trake
mogu interpolirati da naprave jednu jedinstvenu animaciju. Morph je puno
ograničenija od pose animacije jer ne može se spajati s drugim morf
animacijama zbog aplosutnih pozicija vrhova. Pose i morph animacije se mogu
koristiti u paru s skeletalnom animacijom. Sve animacije se mogu izvoditi
programski ili na grafičkom sklopovlju koristedi vertex program. Ogreov
animacijiski sistem radi na principu kontrolera. On interpolira između ključeva u
animacijskoj traci.
Da bi se moglo nešta raditi s Ogreom ne mora se biti upoznat sa svim
aspektima Ogre API-a. Najčešde programer ima samo nekoliko ključnih dijelova
s kojima mora interaktirati u tipičnoj Ogre aplikaciji. Sljedi kratak pregled
ključnih dijelova, a u sljededem poglavlju de biti riječi kako se koriste:
Root Object (korijenski objekt) je glavna polazišna točka svake Ogre aplikacije
i pruža pristup svim podsistemima u Ogre aplikaciji. Konstrukcijom root objekta
aplikacija se pokrede, a njegovom destrukcijom se gasi.
17
ResourceGroupManager je jedinstveni objekt koji na kraju krajeva upravlja
sa svim resursima koje Ogre treba da bi iscrtao neku scenu. Ogre prepoznaje
sljedede vrste resursa:
Mesh: binarni optimizirani format za učitavanje mreže poligona.
Spremaju se kao individualne datoteke s .mesh ekstenzijom da ih Ogre
prepozna i asocira. Također sadrže podatke potrebene za pose i morph
animaciju.
Skeleton: tipično se referenciraju na .mesh datoteke i definira se u njima
hijerarhija kostiju. Također sadrže keyframe podatke potrebne za
skeletalnu animaciju. Spremaju se s .skeleton ekstenzijom često zajedno
s .mesh datotekama na koje se referenciraju.
Materijal: je skriptna datoteka na koju se referencira .mesh datoteka ili
se ručno postavlja u kodu. Najlakše ih opisati kao upute kako obojati
mesh na koji se referenciraju. Najčešde ih stvara exporter iz alata za
modeliranje, a sadrže .materijal ekstenziju. Nije binarni format, tako da je
lako čitljiv bilo kojim tekstualnim editorom.
GPU program: GPU programi (HLSL, GLSL, Cg) su prepoznati s .program
ekstenzijom. Programi niskog levela koriste .asm ekstenziju.
Teksture: 2D teksturalni podaci mogu biti u bilo kojem formatu
podržanom preko OpenIL slikovne biblioteke.
Compositor: Ogreov Compositor framework koristi Compositor skripte
na isti način kao što materijali koriste .materijal skripte. Razlika je jedino
što imaju .compositor ekstenziju.
Font: Ogre koristi datoteke za definiciju fonta koje de koristiti u
overlayima i te datotoeke koriste .font ekstenziju.
Svaki od ovih tipova resursa ima svoj posebni ResourceManager
(MaterialManager,FontManager,...), ali ako programer ne radi zaseban novi
plugin za novu vrstu resursa, nede biti potrebe za raditi s ResourceManager-
om. ResourceManager je odgovoran za traženje resursa po imenu, nema
direktan memoriski pristup managera koji se koristi za zadanu grupu resursa,
nego samo rukuje s ved učitanim resursima koje učitaju onda podređeni
manageri. Sljedi pregled nekih čestih managera u Ogre-u:
18
SceneManager: je s razlogom prvi jer je jedan od najvažnijih. Građen je
na principu grafa scene i služi za strukturiranje scene. On je izvor
SceneNode objekta koji su strukturalni elementi Ogre-ovog dizajna grafa
scene (predstavlja čvor u grafu scene). Sadržaj se spaja na čvor preko
Entity objekta (koji predstavljaju lišde u grafu scene), a sam Entity objekt
je implementacija MovableObject klase. Entity objekt se najčešde učitava
iz memorije gdje postoji kao binarni .mesh file, ali je mogude i stvoriti
ručno objekte kao ravnine i ostale primitive. Sami Entity objekti se ne
kredu kroz scenu, nego su čvorovi na koji se vežu Entity objekti ti koji se
kredu u sceni. Na čvorove je mogude spojiti i druge objekte poput kamere
i svijetla.
LogManager: Jednostavno samo sprema poruke rada sistema da se
mogu pratiti eventualne greške.
DynLibManager: služi za komunikaciju s dinamičkim bibliotekama i
centralni je za Ogre-ov plug-in dizajn.
PlatformManager: pruža apstraktni pristup detaljima sklopovlja i
operativnog sustava, npr. timerima i prozorima
ArchiveManager: služi za upravljanje arhivama na sistemu
ParticleSystemManager: upravlja detaljima i implementacijama raznih
čestičnih sustava, emitera i afektora.
MaterialManager: održava sve učitane materijalske instance u aplikaciji i
omogudava korištenje materijala na bazi imena.
SkeletonManager: upravlja svim učitanim skeleton instancama
MeshManager: upravlja svim meshevima učitanim.
HighLevelGpuProgramManager: upravlja, učitava i kompajlira sve
vosokostupanjske GPU shader i vertex programe korištene u aplikaciji
FontManager: upravlja i učitava sve korištene fontove
OverlayManager: upravlja učitavanjem i kreacijom 2D overlaya klase
koja se tipično koristi za izbornike ili prikaze trenutnih rezultata.
TextureManager: upravlja svim teksturama u aplikaciji
Iako ima još managera, ovo je bio kratak pregled nekih najčešde korištenih.
Na korisniku je dali de koristiti gotove implementacije ili zahvaljujudi plug-in
arhitekturi, može napraviti svoje.
19
5. Korištenje Ogre-a
Sada, po mom mišljenju ide najzanimljivije poglavlje, korištenje Ogre-a. Jedna
od najznačajnijih stvari kod Ogre-a je njegova fleksibilnost gdje se može birati
stupanj kontrole koji želite imati. Ali idemo krenuti od početka...
a) Inicijalizacija:
Prvo što je potrebno napraviti u bilo kojoj Ogre aplikaciji je stvoriti instancu
Root objekta. Konstruktor Root klase prima nekoliko opcionalnih parametara, a
sve su imena datoteka:
Root *root = new Root(); Root *root = new Root("plugins.cfg"); Root *root = new Root("plugins.cfg","ogre.cfg"); Root *root = new Root("plugins.cfg","ogre.cfg","ogre.log"); Root *root = new Root("","");
Sve gornje metode su ispravne. Parametri se predaju da se ne mora mnogo
ručnog koda pisati. Datoteke koje se navode kao parametri su u biti skripte
(osim .log) koje sadrže sve potrebne postavke inicijalizacije. Ne moraju biti tog
istog imena, ali ime je tako navedeno da se shvati bit. Datoteku ogre.log ne
treba posebno objašnjavati, tu se samo logiraju događanja u Ogre-u.
Datoteka plugins.cfg sadrži informaciju o plug-inovima koji de se učitati,
odnosno o modulima koje učitavamo. Ti moduli su najčešde pakirani u obliku
.dll biblioteka. Primjer plugin datoteke:
PluginFolder=. Plugin=RenderSystem_Direct3D9 Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_OctreeSceneManager Prva linija kaže Root klasi gdje treba da traži pluginove koji de biti učitani (u
ovom slučaju direktorij s izvršnom datotekom). Nakon toga jednostavno
nabrajamo pluginove koje želimo učitati. Mogude je to i ručno u kodu napraviti i
to na sljededi način:
root->loadPlugin("RenderSystem_Direct3D9.dll");
root->loadPlugin("Plugin_OctreeSceneManager.dll");
20
Prototip je jednostavan, samo moramo metodi dati koju točno biblioteku da
učita i to je to (.dll za windowse, a .so na Mac OS i Linux) . Na sličan način
možemo i odčitati, odnosno osloboditi resurse koje zauzme jedan plugin
jednostavnim pozivom root->unloadPlugin i na isti način samo damo ime
plugina koji treba osloboditi.
Datoteka ogre.cfg sadrži postavke iscrtavanja.
Render System=Direct3D9 Rendering Subsystem [Direct3D9 Rendering Subsystem] Allow NVPerfHUDD=No Anti aliasing=None Floating-point mode=Fastest Full Screen=No Rendering Device=ATI MOBILITY RADEON HD2600 Vsync=No Video Mode=800 x 600 @ 32-bit colour
Za osnovne stvari ako datoteka ved nije napravljena, može se koristiti Ogre-
ov ugrađeni dialog za odabir postavki pozivom na root->showConfigDialog() i
jednostavnim odabirom opcija, datoteka se automatski izgrađuje.
Nakon što smo osnovne stvari napravili, vrijeme je da se inicijalizira prozor za
iscrtavanje. Prozor se inicijalizira pozivom na metodu root->initialize. Initialize
metoda instruktira root da dovrši svoju inicijalizaciju i stvara prozor za
iscrtavanje. Da bi scena koju iscrtavamo bila vidljiva, treba se napraviti kamera.
Kamera se radi preko SceneManager sučelja, a ide otprilike ovako:
Camera cam= SceneMgr->createCamera("MainCam"); cam->setPosition(Ogre::Vector3(100,15,100)); cam->lookAt(Ogre::Vector3(100,15,-300)); cam->setFarClipDistance(1000); cam->setNearClipDistance(0.1); cam->setAspectRatio(1.33333333);
U ovom primjeru SceneMgr pokazivač je postojeda instanca SceneManager klase o kojoj de biti govora kasnije. Nakon kreiranja kamere, postavljaju se njena svojstva. Sljedede što treba napraviti je stvoriti viewport (gledište) na prozoru za iscrtavanje. To se radi na sljededi način: Viewport *vp=window->addViewport(camera); vp->setBackgroundColour(ColourValue(0,0,0));
Ovaj kod stvara gledište na prozoru koji smo prije inicijalizirali pomodu initialize() metode u Root klasi. Druga linija postavlja boju pozadine da bude
21
crna. Najlakši način da se u Ogre-u vrši iscrtavanje, tj. počne je pozivom metode Root->StartRendering(). To uzrokuje da Ogre iscrtava sadržaj koji ima u sceni. Ogre ipak prije poziva za početak iscrtavanja zahtjeva da se Root klasi doda FrameListener (osluškivač okvira?) klasa. Frame listener je u biti sučelje klase koju treba implementirati. class myFrameListener: public FrameListener{ public: bool frameStarted(const FrameEvent &evt); bool frameEnded(const FrameEvent &evt); }; //dodavanje frameListener klase u Root: root->addFrameListener(myListener); root->startRendering();
Implementacija metode frameStarted() se poziva svaki put prije nego se jedna slika iscrta, dok se frameEnded() metoda poziva nakon što je iscrtana slika. Tipično se u frameStarted metodu ubacuje logika simulacije i/ili igre, dok u frameEnded ubacuje rukovanje s unosom (npr. miš, tikovnica).
b) Upravljanje scenom
Kako je ved spomenuto nekoliko puta, za upravljanje scenom Ogre ima klasu
SceneManager. Njegova inicijalizacija je relativno jednostavna:
SceneManager* SceneMgr=root->createSceneManager(ST_GENERIC,"MySceneManager");
Tijekom učitavanja Ogre-a, ima mnogo pluginova, a među njima su i razne
implementacije SceneManagera. Prvi parametar kaže o kakvom Scene
Manageru se radi. ST_GENERIC kaže da se radi o minimalnoj implementaciji
SceneManagera koji nije optimiziran, ali je jako koristan za scene minimalne
kompleksnosti. Npr. BSPSceneManager se registrira kao ST_INTERIOR jer je
pogodan za rad sa zatvorenim prostorima, a TerrainSceneManager kao
ST_EXTERIOR_CLOSE. Generalno gledano SceneManager je odgovoran za
slijedede zadade:
Stvaranje i pozicioniranje pokretnih objekata, svijetala i kamera u
sceni na način da im se efikasno pristupa u grafu scene
Učitavanje i slaganje geometrije svijeta
22
Odbacivanje nevidljivih objekata i stavljanje vidljivih objekata u red za
iscrtavanje
Organiziranje i sortiranje svijetala
Postavljanje i iscrtavanje sjena u sceni
Postavljanje i iscrtavanje svih ostalih objekata u sceni poput pozadine
i neba
Prosljeđivanje ovog organiziranog sadržaja sustavu iscrtavanja za
iscrtavanje
Gavni razlog zašto Ogre ima više različitih tipova scena je dijelom u njegovom
plugin dizajnu i tome što se mogu učitati različiti manageri da se koriste po
potrebi. Npr. ako u simulaciji prostora imamo zatvorene prostore, zatim izlazak
na otvoreni prostor i u takvim slučajevima najbolje je koristiti scene manager
optimiziran za taj tip geometrije svijeta. S Ogre-om dolazi Octree Scene
manager koji pruža dva tipa: OctreeSceneManager i TerrainSceneManager.
OctreeSceneManager je manager opde namjere i može se koristiti za bilo kakvu
vrstu scene. U drugu ruku TerrainSceneManager je tipični primjer managera za
rad s heightmap (visinska mapa) terenskim scenama. Heitmap je jedna tekstura
gdje vrijednost boje znači visina terena.
Najčešda upotreba SceneManagera je u kreiranju pokretnih i nepokretnih
objekata kao svijetla, kamere, entiteta, čestičnih sustava, bilboarda, skyboxova,
statične geometrije, geometrije svijeta, itd. Sve što u sceni može postojati je
upravljano scene managerom, znači on je odgovoran za stvaranje, dohvadanje i
uništavanje objekata u sceni.
Kako je ved spomenuto, SceneManager je odgovoran za stvaranje i
upravljanje čvorovima (Scene Node) grafa scene. čvor grafa scene može imati
samo jednog roditelja a može imati nijedno ili više dijece koja mogu biti ili drugi
čvorovi ili objekt klase MovableObject koji de se iscrtati. Tijekom inicijalizacije
SceneManager klase korijenski čvor je automatski kreiran, a to je korijenski čvor
koji je jedini koji nema roditeljski čvor i može se redi da je on predak svih
čvorova u sceni. Korijenski čvor se ne može uništiti (osim uništavanjem cijelog
managera). Pogodan je da se na njega veže statična geometrija svijeta, jer iako
je pomičan, nema skoro nikakvog razloga da se miče, pa bi trebao biti smatran
kao nepokretan.
23
Hijerarhija čvorova se stvara dodavanjem dijece na postojedi čvor u grafu
scene. Manager ne stavlja sadržaj ili podatkovne objekte u scenu kad se stvori,
nego se to treba ručno raditi. Obijekt se može prispojiti čvoru u bilo koje
vrijeme i u bilo kojem stanju. Također je mogude prispojiti više objekata na
jedan čvor, ali nije mogude jedan objekt pripojiti više od jednom čvoru. Važno
je razumjeti da se transformacije (translacija, rotacija i skaliranje) rade na
čvorovima, a ne na samim objektima. Iako je koristedi parametre
transformacija, rotacija i skaliranja jednostavnije, podržano i klasično računanje
transformacijskim matricama. Transformacije na određenom čvoru mogu se
gledati na dva načina, a to su iz globalne i lokalne perspektive. Sve se
transformacije odnose u usporedbi s čvorom, a razlika je u tome što globalna
transformacija gleda naspram korijenskog čvora, dok lokalna transformacija
gleda naspram roditeljskog čvora.
Ogre je desni koordinatni sustav, što znači da smjer Z-osi se dobije
vektorskim umnoškom X i Y osi. Naspram 3ds Max programa (kojem je vertikala
Z-os), Ogre vertikalnu os smatra Y osi, x os raste u desno i time dubina je Z os
koja kako se udaljavamo ide u negativne vrijednosti. Na sljededoj slici je kocka
dužine stranice 1 s središtem u ishodištu:
24
Pokretni objekti u sceni su stvoreni u SceneManageru, u njemu se i
pridodaju čvorovima i manager ih po potrebi uništava. Pokretni objekti ne
moraju biti spojeni na graf scene, ali ako nisu spojeni ne mogu se iscrtati. Ved
sam spomenuo da jedan pokretni objekt može biti povezan na samo jedan čvor
u grafu. Iscrtljivi pomični objekti poput mesheva (mreža poligona) sadrže samo
geometriju i informacije o materijalima, ali nikako ne mogu sadržavati ikakvu
informaciju o strukturi grafa scene. Pokretni objekti ne moraju imati geometriju
ili podatke o materijalima, a najbolji primjer toga su kamere i svijetla.
Najbolji način kako demonstrirati neke stvari je primjerom stvaranja
jednostavne scene:
void createScene(void) {
// Postavljanje ambijentnog svijetla mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5)); // Stvarnje točkastog svijetla Light* l = mSceneMgr->createLight("MainLight"); l->setPosition(20,80,50); // Učitavanje mesha Entity *ent = mSceneMgr->createEntity("head", "ogrehead.mesh"); // Postavi materijal učitan iz Example.material ent->setMaterialName("Examples/EnvMappedRustySteel"); // Dodavanje entiteta na čvor mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
}
Rezultat je scena koja izgleda ovako:
25
Od ostalih mogudnosti SceneManagera mogli bi jedino spomenuti sljedede
funkcionalnosti:
Učitavanje geometrije terena
Pravljenje skyplane-a (nebeska ploča), skybox-a (nebeska kutija) i
skydom-a (nebeska kupola)
Definiranje i upravljanje maglom
Raditi upite na sceni, u biti je provjera koji prostor koji objekt zauzima
o ograničavajuda kutija poravnata s osima
o sferno
o Volumno ograničeno ravninom
o Linijsko
o arbitrarno sjecište
Raycasting (bacanje zrake)
Naravno da postoji još mnogo toga, ali ipak za naprednije stvari je najbolje
konzultirati se s službenom dokumentacijom radi više detalja.
c) Materijali
Materijali jednostavno rečeno definiraju kako de objekt kojemu je dodjeljen
reagirati na svijetlost. Osnova za čak i kompleksne materijale je boja. Ogre je po
tome tipičan i podržava četiri vrste boja za opis materijala, a to su ambijentna,
difuzna, emisivna i spekularna. Materijali se najčešde definiraju u alatu za
modeliranje, a tijekom eksporta eksporter izrađuje skriptu materijala najčešde s
direktnim preslikavanjem 1:1. Uz osnovne boje danas korišteno grafičko
sklopovlje podržava bar jednu ili više teksturnih jedinica. Riječ tekstura nije
samo fino ime za 2D sliku, nego može predstavljati i drugačije informacije
poput visinskih mapa, kubičnih ili volumskih mapa, površinskih mapa, itd.
Koristedi teksturnu mapu efikasno se „omota“ 3D objekt s 2D slikama i pikseli
slike de se ili kombinirati ili zamjeniti difuznu komponentu primarnih boja za
opis materijala.
Materijal sadrži jednu ili više tehnika koje sadrže jedan ili više prolaza. Samo
jedna tehnika je aktivna u isto vrijeme. To znači da u sljededoj shemi ako je
Tehnique 0 aktivan, ostale se ne koriste.
26
Tehnique (tehnika) u biti predstavlja alternativni način iscrtavanja objekta u
kojoj se mogu napraviti sheme i definirati nivoi detalja materijala (korisno da se
ne učitavaju velike teksture koje ionako nede biti vidljive), ali što je i važnije,
napraviti specijalizirane tehnike optimizirane za sklopovlje koje de se koristiti.
Pass(prolaz) je potpuno atomsko iscrtavačko stanje za dani iscrtljivi objekt u
zadanoj operaciji na GPU-u. Jedan iscrtljiv objekt se referencira na jedan
materijal, a kako je ranije spomenuto, Ogre odabire tehniku iz tog materijala
koja de se koristiti. Pass također referencira definiciju teksturne jedinice
potrebne za izvršavanje pass-a. Teksturna jedinica (texture unit) u Ogre
materijalu je u biti texture sampler na GPU-u i sadrži referencu na jednu
teksturu. Teksture se tipično nalaze u video memoriji sve dok više nisu
potrebne.
Sintaksa skripte materijala je relativno slična C jeziku. Nije komplicirana za
razumjet i dosta je jednostavno čitati i konstruirati material skriptu.
Najjednostavnije je primjerom vidjeti kako izgledaju skripte i kako se koriste.
Najjednostavnije skripta koja se može napraviti bez ikakvih komplikacija bi
izgledala nekako ovako:
27
material VerySimple {
technique { pass { diffuse 0.5 0.5 0.5 } }
}
Ali ipak na jednostavnim primjerima je skoro nemogude vidjeti sve i naučiti se
kako koristiti skripte. Zato sljededi primjer je material skripta korištena gore na
Ogre glavi kod kreiranja jednostavne scene:
material Examples/EnvMappedRustySteel {
technique { pass { texture_unit Diffuse { texture RustySteel.jpg } texture_unit Environment { texture spheremap.png colour_op_ex add src_texture src_current colour_op_multipass_fallback one one env_map spherical } } }
}
Prva stvar koju treba primjetiti je definirano ime materijala
Examples/EnvMappedRustySteel. Iako izgleda kao put prema sistemskoj
datoteci, to nije slučaj. Sve što je desno od ključne riječi material je ime
materijala, koje mora biti unikatno. Kod prolaza prva teksturna jedinica je
tekstura samog objekta. Druga teksturna jedinica predstavlja sfernu okolnu
mapu (enviroment map). Enviroment mapping nije skupa operacija za
dobivanje reflektivnog dojma površine bez korištenja raytracing-a (pradenje
zrake). Ova teksura se blenda s teksturom specifiranom prije nje. U nastavku su
slike tekstura, mesha bez materijala i mesha sa gornjom skriptom materijala:
28
RustySteel.jpg speremap.png
mesh bez materijala mesh sa materijalom
Skriptiranje materijala za programibilni grafički cijevovod (pipeline) je malo
kompliciranije. Za ubacivanje GPU programa u materijal treba napraviti tri
stvari, a to su: napisati sam program, deklaraciju programa i referencu na
program u samom materijalu. Opisati korištenje ovoga nije jednostavan
zadatak i po mom mišljenju to bi mogao biti zasebni seminar, pa nedu ulaziti u
to. Reči du samo da su podržane sve vrste GPU programa ukoliko ga sklopovlje
podržava.
29
d) Animacije
Ved sam pokrio nešta osnovno o animacijama u pregledu dizajna Ogre-a, a
sad demo udi malo detaljnije u njih. Na funkcionalnoj razini Ogre podržava dva
načina manipulacije objektima, a to su keyframed animacija i drugi tip je preko
kontrolera. Na najvišem apstraktnom nivou animacija u Ogre-u je kolekcija
traka koje su setovi podataka spremljeni kao funkcije vremena. Par vremenska
točka i vrijednost trake stvaraju keyframe. Ogre podržava sljedede tipove
animacijskih traka:
NumericAnimationTrack: keyframeovi sadrže jednu skalarnu vrijednost
AnyNumeric (struktura, tj. tip podatka) tipa
NodeAnimationTrack: keyframe sadrži tri vektora i quaternion koji
predstavljaju poziciju, skalu i rotaciju čvora u danom trenutku
VertexAnimationTrack: keyframe sadrži ili referencira poziciju vrha u
danom vremenu
Animation State (animacijsko stanje) je posrednik interakcije između
aplikacije i animacije u Ogre-u. U alatu za modeliranje se definiraju višestruke
animacije na vremenskoj ravnini, a kao dio eksportiranja različitim vremenskim
intervalima možemo zadati ime. U kodu koristimo to ime da bi se referencirali
na točno određenu animaciju, a objekt vrada animacijsko stanje koje pruža
pristup sljededim parametrima:
Length: dohvat duljine animacije u sekundama
Current position: dohvat ili postavljanje trenutne pozicije u sekundama
od početka animacijskog segmenta
Animation name: ime animacijskog intervala
Looping: provjera ili postavljanje hode li se animacija vrtiti u krug, tj, dali
kad završi krede ispočetka ili potpuno staje
Enabled: provjera ili postavljanje dali je animacija omogudena
Weight: u slučaju blendanja koliki utjecaj ima ova animaciju u tome
U animacijsko stanje dodajemo vrijeme kako bi se animacija nastavila izvoditi
ili oduzimamo vrijeme kako bi išla unazad. Dodaje se uvijek razlika u vremenu
(delta vrijeme) ili oduzima ako želimo da animacija se vrti unatrag.
30
Skeletal Animation se još najviše koristi od svih animacijskih tipova u Ogre-u.
U ovoj vrsti animacije, vrhovi u meshu se povezuju na kosti koje čine kostur.
Kosti u pravom smislu te riječi ovdje ne postoje, nego to su samo matrične
palete i zato pravo tehničko ime ove vrste animacije je matrix palette skining.
Skeletalna animacija radi tako da računa poziciju vrha kao funkciju
transformacijske matrice koja predstavlja kost. Keyframe-ovi u skeletalnoj
animaciji su jednostavno relativni pomaci od kostiju u obliku pozicije,
orijentacije i skale. Skeleton (kostur) u Ogreu definira hijerarhiju sličnu
čvorovima u grafu scene tako da sve kosti imaju roditelja osim korijenske i na
slični način funkcioniraju kad su u pitanju transformacije. Kostur se može
gledati analogno ljudskim zglobovima (pošto jedna kost predstavlja jednu
točku). da bi se vrhovi modela micali kad se kost u kosturu pomakne, oni
moraju biti vezani za kost i to se zove vertex binding (vezanje vrhova). Vrhovi
mogu biti vezani za više kosti, a pomicanje s obzirom na svaku kost se određuje
težinskim faktorima. Tom metodom možemo simulirati npr. savijanje mišida u
tijelu tako da svaki vrh vežemo za nekoliko kostiju s određenim težinskim
faktorom.
Vertex Animation (animacija vrhova) se odnosi na činjenicu da umjesto
animacije kostiju u kosturu i računanje pozicija vrhova kao funkcije tih kostiju,
stvarna pozicija vrhova se animira. Zato ova metoda animacije zahtjeva najviše
resursa jer treba stalno čuvati cijelu kopiju svih podataka animiranih vrhova za
svaki morph tarhet ili pozu u animaciji. Iako vrlo zahtjevno, to je ponekad jedini
način da se dobije željeni efekt pogotovo u animaciji ljudskog lica. Animacija
vrhova referencira cijeli set vrhova na bazi sve-ili-ništa. To znači da na nivou
mesha, sva dijeljena geometrija mesha čini podatke o vrhovima, što znači da se
nemože imati nekoliko vrhova da sudjeluju u recimo morph animaciji, a
nekoliko u pose animaciji. Vertex animacija ima dvije vrste, a to su morph
animacija i pose animacija. Morph animacija je najjednostavniji i najdirektniji
od ta dva tipa. Stvarne pozicije vrhova se spremaju za sekvencijalni „snapshot“
(brzo okidanje?) i zovu se morph targets u morph animaciji. Pozicija vrhova
mesha u sceni se podešavaju i spremljeni keyframe sadrži apsolutnu poziciju
svakog vrha u animiranom meshu. Ova metoda zahtjeva dosta resursa jer svaki
keyframe sadrži kompletnu kopiju podataka vrhova, ali lagano se radi
animacijski proces jer je to jednostavna stvar računanja pozicija između
početne i krajnje. Glavni nedostatak ove vrste animacije je jer se nemogu
31
kombinirati s više morph tarhet animacija u jednu, jer spremljene pozicije
vrhova su apsolutne što čini spajanje podataka različitih animacija skoro
nemogude. (npr. dvije trake da pokušaju animirati istu ruku). Pose animacija
značpi da različite poze modela su spremljene u animacijske trake. Ove poze se
mogu spajati ili blendati da stvore kopliciraniju i realističniju animaciju nego što
je mogude bez blendanja. Najveda razlika između mor4ph animacije je u tome
da se pozicije vrhova spremaju kao pomak od normalne neutralne poze i samo
podaci vrhova na koji se mijenjaju se sprema. To rezultira tome da pose
animacije je fleksibilnija, zahtjeva manje resursa i efikasnija od morph
animacije. Sljededi niz sličica pokazuje različite poze spremljene u isti mesh, a
kompleksnija animacija se dobiva blendanjem između više poza.
neutralan sretan tužan ljut
Blendanje animacija je često korišteno za stvaranje komplicirane animacije u
sceni. Jedina iznimka je da se ne mogu blendati pose i morph animacija
zajedno, ali sve ostale mogu. Kad se blendaju vertex i skeletalna animacija
zajedno Ogre prvo računa(ili blenda) vertex animaciju prvo, zatim na to dodaje
skeletalne deformacije na blendane vrhove. Glavni i najbitniji primjer blendanja
više različitih animacija je animacija ljudi. Tijelo čovjeka je najbolje animirati
skeletalnom animacijom, dok lice s pose animacijom. Blendanje dviju animacija
je također najbolji način da se naprave promjene s jedne animacije na
drugu(npr. promjena sa trčanja na hodanje se radi blendanjem obje vrste
animacija u jednu).
Sve spomenute animacije se mogu izvoditi na dva načina, a to su programski
(na CPU) i sklopovski ubrzana (na GPU pomodu GPU vertex programa).
Sklopovski ubrzana animacija pruža mogudnost da sami kontroliramo red
blendanja, ali to znači da se moraju i stvoriti kompleksni GPU programi i
32
naravno onda se ne mogu spajati s programskom animacijom. Za korištenje je
puno jednostavnija programska animacija, jer za sklopovski ubrzanu animaciju
moramo paziti na specifikaciju korištenog GPU (npr. moja HD2600 grafička
podržava samo 120 kostiju po skining prolazu) i naravno treba dobro poznavati
odabrani jezik GPU programa i njegove mogudnosti. Na kraju valja samo
napomeniti da iako sklopovski ubrzana animacija je teža za svladati, ali zato je
puno efikasnija.
Ovdje sam nabrojao i pokazao kako se koriste neke od najbitnijih
mogudnosti. Iako ih ima mnogo više, i ovisno šta se treba, mislim da bi bilo
dobro spomenuti neke važnije stvari koje nisam pokrio, a to su:
Upravljanje resursima (resource manegement) koji podrazumjeva
inicijalizaciju, učitavanje, uništavanje resursa i pristup i upravljanje
arhivama
Render targets (mete iscrtavanja) gdje se detaljno proučava prozor
iscrtavanja (render window), gledišta (viewport), iscrtavanje tekstura i
materijala, klase iscrtavanja, itd
Billbordi i čestice sa definicijama billborda, setova i lanaca, kao i
definiranje čestičnog sustava pomodu billboarda, emitera čestica,
afektora i načini na koji se to sve iscrtava
Dinamične sjene sa pregledom tehnika sjenčanja koje se koriste u Ogre-u
poput stencil shadowing, texture shadowing, modulative shadow
blending i additive shadow masking
2D i compositing gdje se proučavaju overlayi, Compositor framework,
Compositor Chains i kako se sve to koristi.
33
6. Alati
Koliko god dobar i modan bio ogre, beskoristan je ako nema šta iscrtati. To
nešta što se iscrtava, je uobičajeno stvoreno u drugim programima ili je Ogre-u
predočeno preko nekih formalnih sredstava, što znači da postoje alati koji
pripremaju digitalni sadržaj koji Ogre može koristiti. Pošto Ogre čita jedino svoj
binarni mesh/animacijski format, to znači da za svaki 3D alat koji se koristi,
moramo imati eksporter koji de pretvoriti podatke geometrije, materijala i
animacija u Ogre-ov format. Sljedi kratki pregled alata za koje ogre ima
eksportere:
Blender je potpuno besplatan alat za 3D modeliranje. Eksporter za
blender podržava u potpunosti Ogre-ov mesh format, materijale i
animacije (skeletal, morph i pose). Dio je službenog alata, pa se tako sa
svakom verzijom blendera osvježava
Softimage|XSI je prvi komercijalni program koji je prepoznao vrijednost
Ogre-a, njegove zajednice i pruža direktnu podršku Ogre-ovom timu za
stvaranje eksportera za njihov XSI paket modeliranja.
3D Studio Max je sad u vlasništu Autodeska i jedan je od najkorištenijih
alata za 3D modeliranje u svijetu. Iako je ponuđena podrška za službeno
stvaranje alata za export, napravljeni su službeni exporteri, ali samo za
ranije verzije, dok novije verzije (od 2008 na dalje) nemaju službeni
eksporter
Milkshape 3D je jedan od najjeftinijih komercijalnih 3D alata na tržištu i
dosta je omiljen kod nekih modelera zbog jednostavnosti upotrebe.
Time zbog njegove jednostavnosti i popularnosti postoji službeni
eksporter
Maya je u svoje vrijeme bio jedan od najkorištenijih programa. Iako je
sad isto kao i 3ds max u vlasništvu Autodeska nije toliko popularan kao
3dsmax. Službeni eksporter postoji, ali ima istu sudbinu kao i 3ds max-ov
Mod Ogre-a ipak nije u čekanju da se službeni eksporteri i alati naprave, nego
neki članovici Ogre zajednice aktivno razvijaju i održavaju alate za neke
popularne programske pakete. Sljedi pregled nekoliko najpopularnijih:
34
Alias|Wavefront Maya ima neslužbene eksportere koji su u raznim
stadijima spremnosti, pogodni za 90% zadataka. Nemaju samo
mogudnosti nekih naprednih eksportanja materijala
oFusion je eksporter za 3ds Max koji je prvo razvijen za jednu tvrtku, ali
je postao jedan od najkorištenijih neslužbenih alata. S podrškom za GPU
shadere, eksportanje cijele scene i niza naprednih mogudnosti, postao je
najbolji eksporter uopde. Jedina šteta je što ne podržava verije 2010 na
dalje
OgreMax je ipak najkorišteniji neslužbeni alat za eksport. Popularnost
može zahvaliti time što ne samo da eksporta podatke, nego može služiti
za eksportanje cijele scene u .scene format i time se može cijela scena
automatski učitati u Ogre.
Google SketchUP je sam google razvio sa svojim 3D alatom. Sam
sketchUP je jako jednostavan alat koji se može praktički bez ikakvog
tehničkog znanja koristiti
Za stvaranje digitalnog sadržaja i opdenito kontrolu imamo sljedede
programe:
Particle Editor koji je fleksibilni, modni i najjednostavniji način za kreirati
čestične sustave i skripte preko jednostavnog grafičkog sučelja. Ovo je
stvarna Ogre aplikacija, tako da je u realnom vremenu mogude gledati
stvoreni čestični sustav.
Mesh Viewer je jednostavna aplikacija koja služi samo da bi se učitao i
prikazao objekt i animacije za stvarnu Ogre aplikaciju, bez da se učitaju u
stvarnu aplikaciju.
ATI RenderMonkey Exporter služi za eksportiranje shader programa iz
ATI-evog (Sad AMD-ovog) okruženja za razvoj GPU shader-a. Eksporter
pretvara RenderMoneky podatke u Ogre-ovu material skriptu.
Važni službeni dodaci za Ogre su sljededi:
COLADA koja je bila važna inicijativa u 3D grafičkoj industriji. To je trebao
biti format koji bi univerzalno bio podržan sa strane svih alata u obliku
XML sheme, ali nije bio opde prihvaden u cijeloj industriji. COLADA plugin
je razvijen prema specifikaciji 1.3.1 i očekuje se da de se dalje razvijati.
35
Paging Scene Manager je Ogreov Scene Manager plugin dizajniran da
omogudi efektivno iscrtavanje velikih terena mapiranih heightmapama.
Upravlja nivoima detalja terena i jako je pogodan za simulacije leta i
opdenito simulacije velikih terena.
Streaming Video razvijen je s Theora bibliotekom i namjena mu je
videosadržaj iscrtati umjesto teksture. Zato se naziva i videoplugin.
Također da bi svaka simulacija (ili igra) bila potpuna, treba efikasan način
računanja fizike. Ogre nema službenu biblioteku za rad s fizikom, ali zato ima
niz komercijalnih i nekomercijalnih biblioteka koje u suradnji s Ogre-om rade
bez ikakvih problema, čak se i vežu na entity instancu i omoguduju jako realan
prikaz i računanje fizike. Slijede najvažnije biblioteke:
OgreODE je besplatna biblioteka s svom funkcionalnosti komercijalnih
proizvoda. Biblioteku održava jedan član Ogre-tima u suradnji s ogre
zajednicom.
NxOgre je komercijalana biblioteka i komercijalno se zove Novodex.
Licencu je kupila Agei-a, koju je kasnije kupila NVIDIA. Još Ageia je
integrirala podršku za svoj PhysX procesor i time omogudava sklopovsku
obradu fizike ako sustav ima sklopovlje za to (bilo individualnu PhysX
karticu ili sad neku noviju NVIDIA grafičku karticu).
OgreNewt je također jedna od besplatnih biblioteka koja se redovno
razvija i održava.
Nekoliko skriptnih jezika je povezano direktno na ogre. Pošto je popis dosta
dugačak i sami jezici su u različitim fazama stabilnosti i završenosti, samo du
spomenuti nekoliko najčešdih:
PyOgre korišten za spajanje s Pythonom
OgreDotNet za spajanje s .NET Frameworkom (C# je kompletniji, dok VB
je dosta nestabilan)
Ogre4J za povezivanje s Javom
36
7. Zaključak
Ogre je nizom ovih godina postao jedan jako modan i cjienjen sustav za
iscrtavanje sa obilnom podrškom i velikom bazom korisnika. Također valja
napomeniti da jedan od glavnih razloga njegove popularnosti je velik niz
platformi koje podržava i time smanjuje potrebno vrijeme koje treba uložiti da
bi se program mogao koristiti na drugom operativnom sustavu. Važno je i
napomenuti da je ogre toliko kompleksan, a opet toliko jednostavan da se
može koristiti za sve mogude projekte gdje se zathjeva bilo kakav 3D grafički
prikaz. Zbog niza mogudnosti, pogodan je i za animaciju i simulaciju
kompleksnih stvari poput animacije ljudi, životinja, itd.
S ovakvim tempom u podržanim platformama, kao i veliki broj ljudi koji se
trude doprinjeti (službeno i neslužbeno) Ogre-u, sigurno je da Ogre nije jedna
od onih biblioteka koje, kako se naprave da se ne održavaju i ne rastu s
trenutnim zahtjevima na tržištu. Same činjenice da Ogre radi na iOS uređajima,
android uređajima i da se radi DirectX 11 podrška su dokaz da je ovo ozbiljni
sustav koji de i dalje rasti i razvijati se.
8. Literatura
1. Pro Ogre 2D Programming, Gregory Junker, Apress, 2006.
2. http://www.ogre3d.org
3. Ogre API reference manual (dolazi s SDK)
4. http://www.ogre3d.otg/tikiwiki/Home (tutoriali, upute, alati,...)
5. http://www.ogre3d.org/forums/ (forumi sa svime što se u gornjim materijalima ne može nadi o Ogre-u)