Programujeme grafický engine IX.

opengl_logo.jpg V tej­to čas­ti se­riá­lu bu­de­me po­kra­čo­vať v opi­se štruk­tú­ry sú­bo­ru MD3. Do­kon­čí­me opis hla­vič­ky mo­de­lu MD3, kto­rou sme sa za­ča­li za­obe­rať v pre­doš­lej čas­ti, nes­kôr sa za­me­ria­me na opis hla­vič­ky sie­ťo­vých mo­de­lov.

Štruk­tú­ra sú­bo­rov MD3
Kaž­dý ko­rek­tne vy­tvo­re­ný sú­bor MD3 má na svo­jom za­čiat­ku ulo­že­né in­for­má­cie o hla­vič­ke mo­de­lu MD3, kto­rej sú­čas­ťou sú in­for­má­cie o sie­ťo­vých mo­de­loch. Sie­ťo­vým mo­de­lom sa bu­de­me ve­no­vať v dru­hej po­lo­vi­ci toh­to člán­ku.

Hla­vič­ka mo­de­lu MD3
Naj­pou­ží­va­nej­šie znač­ky na vzá­jom­né pre­po­je­nie ob­jek­tov (mo­de­lov) MD3 sú:
 tag_tor­so – na pre­po­je­nie „hor­nej“ (up­per) a „dol­nej“ (lower) čas­ti po­sta­vy,
 tag_head – na pre­po­je­nie „hla­vy“ (head) a „hor­nej“ čas­ti po­sta­vy,
 tag_weapon – na pre­po­je­nie „zbra­ne“ a „hor­nej“ čas­ti po­sta­vy.

Pri na­čí­ta­va­ní a zob­ra­zo­va­ní ob­jek­tov MD3 ne­mu­sí­me vždy na­čí­tať ce­lú sku­pi­nu sú­bo­rov, rov­na­ko ne­mu­sí­me zob­ra­ziť ce­lú sku­pi­nu. Bez prob­lé­mov mož­no zob­ra­ziť sa­mos­tat­nú časť ob­jek­tu. Na zob­ra­ze­nie ob­jek­tu MD3­je v ap­li­ká­cii MD3­loa­der po­uži­tá re­kur­zív­na fun­kcia DrawPlayer(); tak­že v prí­pa­de nev­hod­né­ho vý­be­ru ob­jek­tu dôj­de k za­blo­ko­va­niu vy­kres­le­nia iné­ho ob­jek­tu zá­vis­lé­ho od ne­ho. No jed­not­li­vé ob­jek­ty pri­ra­de­né znač­kám sa v rám­ci uve­de­nej fun­kcie vy­kre­slia vždy (sa­moz­rej­me, po­kiaľ má kon­krét­na znač­ka pri­ra­de­ný ob­jekt). Mô­že sa sí­ce stať, že pri pre­po­je­ní dvoch a via­ce­rých ob­jek­tov ne­dôj­de k vy­kres­le­niu dru­hé­ho a ďal­šie­ho ob­jek­tu v po­ra­dí, ale ak sa ob­jekt vy­kres­lí, vy­kre­slia sa aj všet­ky ob­jek­ty pri­ra­de­né je­ho znač­kám (všim­ni­me si blok for(), v kto­rom sú pre da­ný ob­jekt vy­kres­le­né všet­ky ob­jek­ty pri­ra­de­né je­ho znač­kám).

Sním­ky a znač­ky
Po­kra­ču­je­me v opi­se ob­sa­hu sú­bo­ru MD3. V nas­le­du­jú­cej ta­buľ­ke je uve­de­ný ob­sah ob­jek­tu Fra­mes:

tab1.jpg

In­for­má­cie uve­de­né v pre­doš­lej ta­buľ­ke ne­bu­de­me v ap­li­ká­cii MD3­loa­der ni­ja­ko zvlášť po­uží­vať. Ich na­čí­ta­nie však mu­sí­me reali­zo­vať, le­bo ako už vie­me, sú­bor MD3 má sek­venč­ný cha­rak­ter. Po úvod­ných blo­koch pred­sta­vu­jú­cich hla­vič­ku mo­de­lu MD3 nas­le­du­je blok Fra­mes, kto­rý tre­ba na­čí­tať, aby sme sa dos­ta­li k blo­ku Tags.

Znač­ky (Tags) sú veľ­mi dô­le­ži­té, pre­to­že prá­ve po­mo­cou nich mô­že­me vzá­jom­ne pre­po­jiť jed­not­li­vé ob­jek­ty MD3. Ďal­šia dô­le­ži­tá úlo­ha zna­čiek je po­skyt­núť in­for­má­cie o po­lo­he a orien­tá­cii ob­jek­tu MD3. Je dô­le­ži­té za­pa­mä­tať si, že po­hyb ob­jek­tov MD3­je vzá­jom­ne zá­vis­lý, a to na zá­kla­de ich vzá­jom­né­ho pre­po­je­nia po­mo­cou ob­jek­tov Tags.

tab2.jpg

Znač­ka je ne­ná­pad­ný, ale nes­mier­ne dô­le­ži­tý kom­po­nent štruk­tú­ry for­má­tu MD3. So znač­ka­mi pra­cu­je­me vo via­ce­rých fun­kciách de­fi­no­va­ných v ap­li­ká­cii MD3­loa­der. Po­mo­cou zna­čiek pre­pá­ja­me jed­not­li­vé ob­jek­ty MD3 (Lin­kMo­del();) a nas­ta­vu­je­me ich po­lo­hu a na­to­če­nie (DrawPlayer();).

Hla­vič­ka sie­ťo­vé­ho mo­de­lu
Dos­tá­va­me sa k po­dsta­te po­uží­va­nia for­má­tu MD3. Po na­čí­ta­ní hla­vič­ky sú­bo­ru MD3, ob­jek­tov Fra­mes a Tags nas­le­du­je na­čí­ta­nie in­for­má­cií o sie­ťo­vých mo­de­loch, kto­ré vy­tvá­ra­jú ob­jekt (mo­del) MD3. Kaž­dý sie­ťo­vý mo­del má svo­ju hla­vič­ku, kto­rej zá­klad­ný­mi údaj­mi sú čí­sel­né úda­je o po­čte sní­mok, po­vr­chov, vr­cho­lov a tro­ju­hol­ní­kov. Ďalej sú to in­for­má­cie o umies­tne­ní po­ľa vr­cho­lov, tro­ju­hol­ní­kov a po­ľa textú­ro­va­cích sú­rad­níc. Prá­ve na zá­kla­de týc­hto in­for­má­cií mô­že­me vy­kres­liť ob­jekt (mo­del) MD3. Dô­le­ži­tá in­for­má­cia je fakt, že v po­li ob­jek­tov Ver­tex sú ulo­že­né všet­ky vr­cho­ly ob­jek­tu de­fi­no­va­né pre všet­ky sním­ky všet­kých ani­má­cií toh­to ob­jek­tu. To zna­me­ná, že po­kiaľ má da­ný ob­jekt de­fi­no­va­ných napr. 10 roz­diel­nych dru­hov po­hy­bov (ani­má­cií) a kaž­dá z nich má 10 sní­mok (fra­mes), v po­li vr­cho­lov bu­de ulo­že­ných 10 × 10 = 100 úda­jov o tom is­tom vr­cho­le (ide o de­fi­ní­ciu po­hy­bu da­né­ho vr­cho­lu pre kaž­dý druh po­hy­bu a pre kaž­dú sním­ku v rám­ci toh­to dru­hu po­hy­bu). Jed­no­duc­hšie po­ve­de­né, ak má ob­jekt MD3 (po­sta­va) de­fi­no­va­né napr. po­hy­by chôd­za, beh, skok a kaž­dý z nich má 10 sní­mok, v po­li vr­cho­lov bu­de pre kaž­dý vr­chol ulo­že­ných 3 × 10 = 30 úda­jov.

tab3.jpg

Hla­vič­ky sie­ťo­vých mo­de­lov a ich inter­ný ob­sah je na­čí­ta­va­ný vo fun­kcii Load­Mo­del(); Naj­skôr sa na­čí­ta­jú in­for­má­cie o ob­jek­toch Sha­ders, po­tom in­dexy na vr­cho­ly tro­ju­hol­ní­kov, nás­led­ne textú­ro­va­cie sú­rad­ni­ce a na­po­kon všet­ky vr­cho­ly pat­ria­ce sie­ťo­vé­mu mo­de­lu (vrá­ta­ne vr­cho­lov de­fi­no­va­ných pre kaž­dú sním­ku kaž­dé­ho dru­hu po­hy­bu).

Sha­de­ry (Sha­ders)
Ob­jek­ty Sha­ders ne­bu­de­me v ap­li­ká­cii MD3­loa­der po­uží­vať. Tie­to ob­jek­ty sú v sú­bo­re MD3 de­fi­no­va­né z dô­vo­du po­uži­tia tzv. sha­der skrip­tov, kto­ré slú­žia na mo­di­fi­ká­ciu ap­li­ká­cie textúr na po­vr­chy sie­ťo­vých mo­de­lov. Ide naj­mä o zme­nu spô­so­bu ren­de­rin­gu textúr, kto­rý mô­že byť ľu­bo­voľ­ný pre ľu­bo­voľ­ný sie­ťo­vý mo­del, resp. pre ľu­bo­voľ­nú textú­ru ap­li­ko­va­nú na po­vrch toh­to mo­de­lu. Sha­der skrip­ta­mi do­ká­že­me mo­di­fi­ko­vať vzhľad textú­ry a tým vý­raz­ne skva­lit­niť vzhľad po­vr­chov ob­jek­tov. O sha­de­roch eš­te bu­de­me v tom­to se­riá­li ve­ľak­rát ho­vo­riť. No v tom­to mo­men­te sa ni­mi ne­bu­de­me viac za­obe­rať.

tab4.jpg

In­dexy na vr­cho­ly tro­ju­hol­ní­kov (Trian­gles)
O tzv. in­dexoch na vr­cho­ly sme sa viac­krát zmie­ni­li už v pre­doš­lom se­riá­li. V OpenGL sa od­ka­zo­va­nie na vr­cho­ly po­mo­cou in­dexov veľ­mi čas­to po­uží­va. To­to tvr­de­nie mož­no roz­ší­riť aj na mno­hé mo­der­né gra­fic­ké ap­li­ká­cie pra­cu­jú­ce s troj­roz­mer­ný­mi ob­jek­tmi. V struč­nos­ti ide o to, že da­ný vr­chol je v rám­ci de­fi­ní­cie sie­ťo­vé­ho mo­de­lu de­fi­no­va­ný iba raz a tvor­ba tro­ju­hol­ní­kov po­zos­tá­va­jú­cich zo sku­pi­ny 3 vr­cho­lov je zá­vis­lá prá­ve od in­dexov od­ka­zu­jú­cich sa na 1., 2. a 3. vr­chol kon­krét­ne­ho tro­ju­hol­ní­ka. Vy­chád­za sa pri­tom zo sku­toč­nos­ti, že su­se­dia­ce tro­ju­hol­ní­ky sú tvo­re­né tý­mi is­tý­mi vr­chol­mi (ma­jú 1, resp. 2 spo­loč­né vr­cho­ly). Prá­ve tie­to spo­loč­né vr­cho­ly sú v zoz­na­me vr­cho­lov de­fi­no­va­né iba raz, čím sa vý­raz­ne zmen­ší veľ­kosť dá­to­vých sú­bo­rov. Ten­to spô­sob ulo­že­nia a prís­tu­pu k úda­jom o vr­choloch je za­uží­va­ný a je­ho prak­tic­ké po­uži­tie je bez­prob­lé­mo­vé.

tab5.jpg

Na­bu­dú­ce...
V bu­dú­cej čas­ti se­riá­lu do­kon­čí­me opis hla­vič­ky sie­ťo­vé­ho mo­de­lu. V po­sled­nej čas­ti se­riá­lu sú­vi­sia­cej s for­má­tom MD3 do­kon­čí­me opis štruk­tú­ry sú­bo­ru MD3 vrá­ta­ne prá­ce s ani­má­cia­mi. Po­tom 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.

Ďal­šie čas­ti >>

Zdroj: Infoware 8-9/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