Programujeme grafický engine X.

opengl_logo.jpg Tou­to čas­ťou se­riá­lu ukon­čí­me té­mu ve­no­va­nú opi­su for­má­tu MD3. Do­kon­čí­me si cha­rak­te­ris­ti­ku štruk­tú­ry sú­bo­ru MD3v­rá­ta­ne opi­su prá­ce s ani­má­cia­mi. Na za­čiat­ku člán­ku si dopl­ní­me in­for­má­cie o ďal­ších blo­koch, kto­ré sú sú­čas­ťou hla­vič­ky sie­ťo­vé­ho mo­de­lu. V dru­hej čas­ti člán­ku ukon­čí­me opis štruk­tú­ry for­má­tu MD3 uve­de­ním al­go­rit­mu de­kó­do­va­nia nor­má­lo­vých vek­to­rov a in­for­má­cií po­treb­ných na vy­ko­ná­va­nie po­hy­bu ob­jek­tov.

Hla­vič­ka sie­ťo­vé­ho mo­de­lu
Po blo­ku in­dexov na vr­cho­ly tro­ju­hol­ní­kov, opí­sa­né­ho v pre­doš­lej čas­ti se­riá­lu, nas­le­du­jú v hla­vič­ke sie­ťo­vé­ho mo­de­lu blo­ky ob­sa­hu­jú­ce in­for­má­cie o textú­ro­va­cích sú­rad­ni­ciach a vr­choloch.

Po­vr­chy, textú­ro­va­nie (ST)
Sú­bor MD3 ok­rem blo­ku Sha­ders, opí­sa­né­ho v pred­chád­za­jú­cej čas­ti se­riá­lu, neob­sa­hu­je ni­ja­ké ďal­šie in­for­má­cie o textú­ro­va­ní ob­jek­tov MD3. Tie­to in­for­má­cie sú ulo­že­né v exter­ných dá­to­vých sú­bo­roch. Blok ST ob­sa­hu­je iba textú­ro­va­cie sú­rad­ni­ce:

tab1.jpg

Ďal­šie in­for­má­cie o po­kry­tí po­vr­chov (textú­ro­va­ní) sa uk­la­da­jú v sú­bo­roch, kto­rých náz­vy ko­reš­pon­du­jú s náz­va­mi sú­bo­rov MD3. Nap­rík­lad pre ob­jekt „hla­vy“ je v rov­na­kej zlož­ke ulo­že­ný sú­bor head.skin, kto­rý ob­sa­hu­je in­for­má­cie o po­kry­tí po­vr­chu toh­to ob­jek­tu. Kon­krét­ne ide o ná­zov sie­ťo­vé­ho mo­de­lu a ces­tu k sú­bo­ru ob­sa­hu­jú­ce­mu ob­rá­zok (textú­ru), kto­rým sa po­kry­je da­ný sie­ťo­vý mo­del.

Štan­dard­ný ob­sah sú­bo­ru *.skin je nas­le­du­jú­ci:

ná­zov_sie­ťo­vé­ho_mo­de­lu,ces­ta_k_sú­bo­ru_s_textú­rou
ná­zov_sie­ťo­vé­ho_mo­de­lu,ces­ta_k_sú­bo­ru_s_textú­rou
ná­zov_sie­ťo­vé­ho_mo­de­lu,ces­ta_k_sú­bo­ru_s_textú­rou
...

Na­čí­ta­nie exter­ných sú­bo­rov ob­sa­hu­jú­cich in­for­má­cie o po­uži­tých textú­rach je reali­zo­va­né vo fun­kcii Load­Skin();. V tej­to fun­kcii je po­stup­ne na­čí­ta­ný ob­sah sú­bo­rov *.skin, pri­čom sú ta­kis­to na­čí­ta­né všet­ky textú­ry (exter­né sú­bo­ry s ob­ráz­ka­mi), kto­ré bu­dú po­treb­né na nes­kor­šie po­kry­tie po­vr­chov ob­jek­tov. Pri­ra­de­nie textú­ry kon­krét­ne­mu po­vr­chu sa reali­zu­je vo fun­kcii Set­Sur­fa­ce­Textu­re(); Pri­ra­de­nie je za­lo­že­né na kon­tro­le náz­vu sie­ťo­vé­ho mo­de­lu, ku kto­ré­mu je pri­ra­de­ný iden­ti­fi­ká­tor vy­tvo­re­né­ho ob­jek­tu textú­ry (ob­jek­ty textúr sú vy­tvá­ra­né štan­dar­dnou ces­tou v rám­ci OpenGL). Nes­kôr pri vy­kres­ľo­va­ní tro­ju­hol­ní­kov da­né­ho sie­ťo­vé­ho mo­de­lu je vy­bra­tá adek­vát­na textú­ra, kto­rou sa po­kry­je po­vrch toh­to sie­ťo­vé­ho mo­de­lu (fun­kcia DrawMo­del();).

Vr­cho­ly (Ver­tex)
Úda­jo­vý blok sie­ťo­vé­ho mo­de­lu sa kon­čí de­fi­ní­ciou úda­jov o vr­choloch sie­ťo­vé­ho mo­de­lu pre kaž­dú sním­ku a pre všet­ky dru­hy po­hy­bov. Kon­krét­ne ide o ulo­že­nie troch sú­rad­níc (X, Y, Z) pre kaž­dý vr­chol a kó­du nor­má­lo­vé­ho vek­to­ra (N) v da­nom vr­cho­le.

tab2.jpg

Kó­do­va­nie nor­má­lo­vých vek­to­rov
For­mát MD3 po­uží­va na ulo­že­nie nor­má­lo­vých vek­to­rov tzv. kó­do­va­nie do dvoch ok­te­tov (two oc­tets co­ding). Pri tom­to kó­do­va­ní sa in­for­má­cia o nor­má­le ulo­ží do 16 bi­tov s tým­to us­po­ria­da­ním:

tab3.jpg

Vy­chád­za sa z fak­tu, že na ulo­že­nie úda­jov o nor­má­lo­vom vek­to­re sta­čí ulo­žiť in­for­má­cie o dvoch uh­loch, kto­rý zvie­ra ten­to vek­tor v da­nom sú­rad­ni­co­vom sys­té­me. Šír­kou a dĺžkou sa ro­zu­mie ulo­že­nie veľ­kos­tí dvoch uh­lov, kto­ré zvie­ra nor­má­lo­vý vek­tor dĺžky 1.0 v sfé­ric­kom sú­rad­ni­co­vom sys­té­me (sphe­ri­cal coor­di­na­tes). Tie­to uh­ly sú vy­jad­re­né čí­sel­ný­mi údaj­mi v inter­va­le <0;255> (8 bi­tov). Na de­kó­do­va­nie tak­to ulo­že­ných nor­má­lo­vých vek­to­rov mož­no po­užiť jed­no­duc­hú troj­roz­mer­nú pre­vod­nú ta­buľ­ku, kto­rej pr­vky vy­po­čí­ta­me po­mo­cou nas­le­du­jú­cich vzťa­hov:

lat=((nor­mal shift-right 8) bi­na­ry-and 255)*2*PI/255
lng=(nor­mal bi­na­ry and 255)*2*PI/255
x=cos(lat)*sin(lng)
y=sin(lat)*sin(lng)
z=cos(lng)

Tá­to troj­roz­mer­ná ta­buľ­ka sa prip­ra­ví po­mo­cou fun­kcie Init();, na kto­rej kon­ci je nás­led­ne na­čí­ta­ný ob­jekt MD3 po­sta­vy po­zos­tá­va­jú­ci z jed­not­li­vých čas­tí (up­per, lower, head, weapon). Uh­ly ulo­že­né v ta­buľ­ke sa po­uži­jú v ča­se vy­kres­le­nia ob­jek­tu MD3 v rám­ci fun­kcie DrawPlayer();.

Ani­má­cia
Sú­bor MD3 v se­be uc­ho­vá­va in­for­má­cie o po­lo­he a orien­tá­cii vr­cho­lov sie­ťo­vých mo­de­lov, z kto­rých sú zlo­že­né ob­jek­ty MD3, a to pre všet­ky dru­hy po­hy­bov. No sú­bor MD3 neob­sa­hu­je in­for­má­cie o za­čiat­ku kon­krét­ne­ho dru­hu po­hy­bu ani o je­ho tr­va­ní. Tie­to in­for­má­cie sú ulo­že­né v exter­nom dá­to­vom sú­bo­re s náz­vom ani­ma­tion.cfg. Po­ra­die jed­not­li­vých dru­hov po­hy­bov je v sú­bo­re ani­ma­tion.cfg veľ­mi strik­tne sta­no­ve­né a v prí­pa­de, že sa ne­dodr­ží, dôj­de k chy­be vo vy­ko­ná­va­ní ap­li­ká­cie. Ob­jek­ty MD3u­lo­že­né v sú­bo­roch head.md3 a sú­bo­roch ob­sa­hu­jú­cich de­fi­ní­ciu „zbra­ne“ ne­ma­jú pri­ra­de­nú ani­má­ciu. Ako sme si uvied­li pri opi­se ob­jek­tov Tags, ob­jekt MD3p­red­sta­vu­jú­ci „hla­vu“ po­sta­vy pri svo­jom po­hy­be nas­le­du­je po­hyb znač­ky tag_head. Rov­na­ko je to aj v prí­pa­de ob­jek­tu „zbra­ne“, kto­rý nas­le­du­je znač­ku tag_weapon.

Štan­dard­ný ob­sah sú­bo­ru ani­ma­tion.cfg je uve­de­ný v nas­le­du­jú­cej ta­buľ­ke (kon­krét­ne hod­no­ty uvád­za­me iba ako prík­la­dy, po­ra­die dru­hov po­hy­bov je však všeo­bec­ne plat­né):

tab4.jpg

Na­čí­ta­nie uve­de­né­ho sú­bo­ru sa reali­zu­je vo fun­kcii Loa­dA­nim(); Fun­kcia má sí­ce na pr­vý po­hľad zlo­ži­tú štruk­tú­ru, ale ide iba o jed­no­duc­hé na­čí­ta­nie šty­roch úda­jov pat­ria­cich kaž­dé­mu dru­hu po­hy­bu:
1. čís­lo 1. sním­ky, 2. po­čet sní­mok da­né­ho dru­hu po­hy­bu,
3. po­čet opa­ku­jú­cich sa sní­mok,
4. po­čet sní­mok za se­kun­du.

Tie­to in­for­má­cie sa nás­led­ne po­uží­va­jú v rám­ci fun­kcie Se­tA­nim();, po­mo­cou kto­rej sa nas­ta­vu­jú hod­no­ty pre­men­ných sú­vi­sia­ce s ply­nu­tím ča­su. Ča­so­vo zá­vis­lé vy­kres­ľo­va­nie ob­jek­tu sa reali­zu­je vo fun­kcii Ren­der(); na kto­rej za­čiat­ku sa nas­ta­via prís­luš­né pa­ra­met­re ani­má­cie a nes­kôr sa vy­ko­ná fun­kcia DrawPlayer();.

Na­bu­dú­ce...
V bu­dú­cej čas­ti se­riá­lu sa vrá­ti­me k ap­li­ká­cii En­gi­ne, do kto­rej sa po­kú­si­me in­teg­ro­vať prip­ra­ve­né ob­jek­ty MD3. Ok­rem in­teg­rá­cie ob­jek­tov MD3 scé­nu dopl­ní­me o nie­koľ­ko te­rén­nych ob­jek­tov, kto­rých po­uži­tie je ne­vyh­nut­né na na­vo­de­nie čo naj­reál­nej­šie­ho vne­mu.

Ďal­šie čas­ti >>

Zdroj: Infoware 10/2008



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