Programujeme grafický engine XXXVII.

opengl_logo.jpg V tej­to a ta­kis­to v nas­le­du­jú­cej čas­ti se­riá­lu bu­de­me rie­šiť syn­chro­ni­zá­ciu streľ­by s po­hy­bom po­sta­vy. Pô­vod­ne sme sa tej­to ob­las­ti ve­no­va­li od­de­le­ne od blo­kov sú­vi­sia­cich so zob­ra­ze­ním po­sta­vy. Ten­to­raz však všet­ky po­hy­by zo­synchro­ni­zu­je­me tak, aby sme do­siah­li čo naj­ver­nej­ší vi­zuál­ny do­jem nie­len pri zob­ra­zo­va­ní po­sta­vy a zbra­ne, ale aj pri cel­ko­vej dy­na­mi­ke streľ­by.

Po­sta­va hrá­ča, zbraň a ani­má­cie
V na­šom en­gi­ne po­uží­va­me tzv. po­sta­vy MD3. Ide o po­sta­vy hrá­čov a iných ob­jek­tov (vrá­ta­ne zbra­ní), kto­rých geo­me­tria je ulo­že­ná v sú­bo­roch for­má­tu MD3. Ide sí­ce o star­ší for­mát, ale na na­še úče­ly do­ko­na­le po­sta­ču­je. Dô­le­ži­tý je fakt, že sú­bo­ry MD3 ok­rem opi­su geo­me­trie ob­jek­tov (mo­dels) ob­sa­hu­jú aj in­for­má­ciu o ani­má­ciách (ani­ma­tions). Na­ša úlo­ha je pris­pô­so­biť tran­sfor­má­cie, kto­rý­mi up­ra­vu­je­me po­hľad ava­ta­ra, jed­not­li­vým po­hy­bom (ani­má­ciám) po­sta­vy MD3. Od­de­le­ne ide o správ­ne po­su­ny a ro­tá­cie, spo­loč­ne ide o prís­luš­né úp­ra­vy ma­ti­ce OpenGL Mo­del­view (tran­sfor­mač­nej ma­ti­ce).

engine obr1.jpg
Obr. 1 Po­sta­va sa­lu­tu­je (sním­ka z ani­má­cie)


Tran­sfor­má­cie

Na to, aby sme moh­li po­hľad ava­ta­ra zo­synchro­ni­zo­vať s po­hy­bom po­sta­vy MD3, mu­sí­me správ­ne chá­pať po­dsta­tu roz­die­lu med­zi tzv. pries­to­rom ob­jek­tu (ob­ject spa­ce) a spo­loč­ným oko­lím (world spa­ce). Med­zi uve­de­ný­mi pries­tor­mi exis­tu­je pev­ne de­fi­no­va­ný vzťah, kto­rý vy­tvá­ra tzv. vzťaž­nú sús­ta­vu. Ďalej mu­sí­me vo všet­kých sú­vis­los­tiach po­znať prie­beh a vý­sle­dok tran­sfor­má­cií ap­li­ko­va­ných na ob­jek­ty scé­ny. Neus­tá­le mu­sí­me mať na zre­te­li, že aj ne­patr­ná zme­na niek­to­ré­ho z tran­sfor­mač­ných pa­ra­met­rov ale­bo čo i len vý­me­na po­ra­dia tran­sfor­má­cií bu­de mať po­dstat­ný vplyv na ko­neč­ný vý­sle­dok.

engine obr2.jpg

Obr. 2 Po­sta­va ču­pí (sním­ka z ani­má­cie)

Zá­kla­dom al­go­rit­mu, kto­rý sme zvo­li­li, je tzv. skry­té (dum­my) vy­kres­le­nie po­sta­vy MD3. Pri tom­to vy­kres­le­ní sa vlas­tne nič nek­res­lí, ale je­ho vý­stu­pom je pres­ne tá ma­ti­ca Mo­del­view, kto­rá by bo­la ap­li­ko­va­ná v prí­pa­de, ke­by k vy­kres­le­niu sku­toč­ne doš­lo. Pre­to­že fun­kcia, kto­rú po­uží­va­me na vy­kres­le­nie po­sta­vy MD3, je re­kur­zív­na, zís­ka­nie pr­vkov tran­sfor­mač­nej ma­ti­ce mu­sí­me uro­biť pres­ne v tom re­kur­zív­nom kro­ku, v kto­rom by sa ma­la vy­kres­liť sle­do­va­ná časť po­sta­vy (head).

Uve­de­ný krok je prak­tic­ky rie­še­ný v rám­ci re­kur­zív­nej fun­kcie drawPlayer() mo­du­lu Load­MD3 (com­mon/load­md3.cpp, com­mon/load­md3.h). Tak ako je zvy­kom, všet­ky re­le­van­tné čas­ti kó­du sú po­drob­ne oko­men­to­va­né, tak­že na tom­to mies­te ich ne­bu­de­me ďa­lej ro­zo­be­rať.

Pre­to­že vy­kres­le­nie scé­ny reali­zu­je­me in­ver­zne vzhľa­dom na vy­kres­le­nie ob­jek­tov, zís­ka­nú ma­ti­cu mu­sí­me pred jej po­uži­tím „in­ver­to­vať“. V po­ní­ma­ní 3D gra­fi­ky ide o vý­po­čet tran­spo­no­va­nej ma­ti­ce a zme­nu zna­mien­ka jej ­tran­slač­ných pr­vkov. Náš al­go­rit­mus ap­li­ku­je jed­not­li­vé tran­sfor­má­cie (ro­tá­cia, po­sun) od­de­le­ne. Z uve­de­né­ho dô­vo­du tran­slač­né pr­vky ma­ti­ce ne­be­rie­me do úva­hy a po­sun nes­kôr rie­ši­me po­mo­cou fun­kcie glTran­sla­te().

Re­le­van­tná časť al­go­rit­mu je umies­tne­ná a po­drob­ne oko­men­to­va­ná vo fun­kcii OGL_draw() mo­du­lu Inter­fa­ce (inter­fa­ce.cpp, inter­fa­ce.h).

engine obr3.jpg
Obr. 3 Hráč v ro­le proti­hrá­ča

Ani­má­cie
Na­mi zvo­le­ný prís­tup k zos­ta­ve­niu tran­sfor­mač­nej ma­ti­ce do­vo­ľu­je do en­gi­nu okam­ži­te im­ple­men­to­vať ani­má­cie MD3, pri­čom je úpl­ne jed­no, o kto­rú kon­krét­nu ani­má­ciu ide. Po­hľad ava­ta­ra bu­de vždy správ­ne zo­synchro­ni­zo­va­ný s po­hľa­dom po­sta­vy MD3. Sku­toč­né vy­kres­le­nie po­sta­vy MD3 je po­treb­né z dô­vo­du po­uži­tia zr­ka­diel a ta­kis­to v prí­pa­de zob­ra­ze­nia proti­hrá­čov. To­to vy­kres­le­nie sa reali­zu­je rov­na­kou fun­kciou, akou sme napĺňa­li ma­ti­cu Mo­del­view. V tom­to prí­pa­de však ok­rem ro­tá­cií ap­li­ku­je­me aj po­sun a po­sta­vu vy­kres­lí­me až po ap­li­ká­cii skôr zís­ka­nej tran­sfor­mač­nej ma­ti­ce (te­da úpl­ne rov­na­ko, ako vy­kres­lí­me všet­ky os­tat­né ob­jek­ty scé­ny).

Na­bu­dú­ce...
Na­bu­dú­ce bu­de­me ply­nu­le po­kra­čo­vať v za­ča­tej té­me. Do­kon­čí­me opis im­ple­men­tá­cie ani­má­cií a nás­led­ne sa bu­de­me po­drob­ne ve­no­vať proti­hrá­čom.

Ďal­šie čas­ti >>

Zdroj: Infoware 6-7/2011



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXVII.
V tejto a takisto v nasledujúcej časti seriálu budeme riešiť synchronizáciu streľby s pohybom postavy. Pôvodne sme sa tejto oblasti venovali oddelene od blokov súvisiacich so zobrazením postavy. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXVI.
V tejto časti seriálu sa budeme venovať tomu, ako možno do grafických (herných) enginov implementovať objekty reprezentujúce rebríky (ladders). čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXV.
V tejto časti seriálu podrobnejšie rozoberieme jednotlivé časti programového kódu súvisiace s implementáciou streľby. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXIV.
V tejto časti seriálu vám v stručnosti predstavíme tzv. systémy častíc (particle systems). Kvalitne navrhnutými systémami častíc dokážeme veľmi rýchlo a elegantne zvýšiť dynamiku grafických aplikácií. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXIII.
V predchádzajúcej časti seriálu sme dokončili kapitolu, v ktorej sme sa venovali simulácii fyziky. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXII.
Touto časťou seriálu ukončíme tému implementácie fyzikálnych zákonov v rámci grafických enginov. Všetky vedomosti, ktorými v tomto okamihu disponujeme čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXI.
Týmto článkom sa pomaly dostávame k záveru celku, v ktorom sme sa zaoberali simuláciou fyziky. Zostáva nám opísať princíp detekcie kolízií a uviesť spôsob reakcie simulačného systému čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXX.
V tomto pokračovaní seriálu si doplníme teoretické vedomosti potrebné na implementáciu fyzikálnych zákonov v grafických a herných enginoch. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter