Programujeme grafický engine VIII.

opengl_logo.jpg V tej­to čas­ti se­riá­lu za­čne­me opi­so­vať štruk­tú­ru dá­to­vých sú­bo­rov s prí­po­nou md3. Tie­to tzv. MD3 sú­bo­ry uk­la­da­jú in­for­má­cie v sú­la­de s pra­vid­la­mi 3D for­má­tu vy­vi­nu­té­ho fir­mou id Software, kto­rý bol pr­výk­rát po­uži­tý v hre Quake III Are­na. Uve­de­ný for­mát na uk­la­da­nie troj­roz­mer­ných úda­jov sme vy­bra­li zá­mer­ne, a to naj­mä pre­to, aby sme uká­za­li je­den z čas­to po­uží­va­ných spô­so­bov, po­mo­cou kto­ré­ho mož­no do gra­fic­kých en­gi­nov vkla­dať po­hyb­li­vé ob­jek­ty.

Kaž­dý z mo­der­ných en­gi­nov po­uží­va is­tý druh dá­to­vých sú­bo­rov, kto­ré opi­su­jú vzhľad a sprá­va­nie sa ob­jek­tov vkla­da­ných do scén. Aj nap­riek to­mu, že MD3 je star­ší for­mát, je riad­ne zdo­ku­men­to­va­ný a stá­le ho mož­no s vý­ho­dou po­užiť pri tvor­be mo­der­ných en­gi­nov, resp. mô­že­me si po­mo­cou ne­ho uká­zať nie­koľ­ko zá­klad­ných prin­cí­pov po­uží­va­nia exter­ných dá­to­vých sú­bo­rov.

MD3
MD3 je 3D for­mát exter­ných dá­to­vých sú­bo­rov, po­uží­va­ný na opis vzhľa­du 3D ob­jek­tov, ku kto­ré­mu je pri­ra­de­ný opis po­hy­bov týc­hto ob­jek­tov a opis inter­ak­cie s iný­mi ob­jek­tmi ale­bo so scé­nou. Sú­bo­ry MD3 sú jed­no­duc­hé sek­ven­čné sú­bo­ry, v kto­rých sú jed­not­li­vé in­for­má­cie ulo­že­né v ra­de za se­bou (sequen­tial­ly). Štruk­tú­ra týc­hto sú­bo­rov je po­mer­ne jed­no­duc­há, nej­de o zlo­ži­tý for­mát. Prís­tup k ulo­že­ným in­for­má­ciám je veľ­mi jed­no­duc­hý a mož­no ho reali­zo­vať po­mo­cou ľu­bo­voľ­né­ho prog­ra­mo­va­cie­ho ja­zy­ka, kto­rý ob­sa­hu­je fun­kcie na prá­cu s bi­nár­ny­mi sú­bor­mi.

Po­hyb, resp. ani­má­cia (ani­ma­tion) MD3 ob­jek­tu je v sú­bo­roch MD3 opí­sa­ný kon­krét­nou po­lo­hou jed­not­li­vých vr­cho­lov sie­ťo­vých mo­de­lov (sur­fa­ces, mes­hes), z kto­rých sú zlo­že­né ob­jek­ty. Ta­ký­to druh de­fi­ní­cie ani­má­cií sa nie­ke­dy ozna­ču­je aj ako tzv. de­for­má­cia sie­ťo­vých mo­de­lov (mesh de­for­ma­tion), resp. ani­má­cia vr­cho­lov (ver­tex ani­ma­tion). Vý­ro­ba ta­kýc­hto ani­má­cií je po­mer­ne zlo­ži­tá, pre­to­že sa pri nej mu­sí de­fi­no­vať po­lo­ha kaž­dé­ho vr­cho­lu. Pre­to via­ce­ré MD3 edi­to­ry po­uží­va­jú niek­to­rý z iných dru­hov de­fi­ní­cie ani­má­cií a kon­ver­ziu týc­hto in­for­má­cií na in­for­má­cie o po­lo­he vr­cho­lov us­ku­toč­ňu­jú až v ča­se expor­tu z inter­né­ho for­má­tu edi­to­ra do exter­né­ho sú­bo­ru MD3.

Nas­le­dov­ní­kom for­má­tu MD3 je MD4, v kto­rom bo­la na za­zna­me­na­nie po­hy­bu po­uži­tá tec­hno­ló­gia tzv. ani­má­cie kos­tí (bo­nes ani­ma­tion, resp. ske­le­ton ani­ma­tion). Ten­to zlep­še­ný spô­sob opi­su ani­má­cie nep­ra­cu­je s kaž­dým jed­not­li­vým vr­cho­lom sie­ťo­vé­ho mo­de­lu, ale up­ra­vu­je uce­le­nú sku­pi­nu vr­cho­lov (groups). V na­šom se­riá­li ne­bu­de­me opi­so­vať for­mát MD4, ale vrá­ti­me sa k pô­vod­né­mu for­má­tu MD3, a to hlav­ne pre je­ho jed­no­duc­hosť.

Na­čí­ta­nie ob­jek­tov ulo­že­ných vo for­má­te MD3 pred­ve­die­me na prak­tic­kej ap­li­ká­cii, kto­rá je príl­ohou dneš­nej čas­ti se­riá­lu. Ana­ló­giu ku všet­kým kom­po­nen­tom for­má­tu MD3 opi­so­va­ným v tom­to se­riá­li mô­že­me náj­sť v sú­bo­roch mMD3­mo­del.cpp (mMD3­mo­del.h), kto­ré sú sú­čas­ťou zdro­jo­vé­ho kó­du ap­li­ká­cie MD3­loa­der. Pri opi­se štruk­tú­ry for­má­tu MD3 bu­de­me vy­uží­vať nap­rog­ra­mo­va­nú ap­li­ká­ciu, po­mo­cou kto­rej prak­tic­ky uká­že­me, ako na­čí­ta­vať ob­jek­ty MD3.

Štruk­tú­ra sú­bo­rov MD3
V nas­le­du­jú­cich blo­koch opí­še­me štruk­tú­ru dá­to­vé­ho sú­bo­ru MD3. In­for­má­cie uve­de­né v prís­luš­ných ta­buľ­kách súh­la­sia s in­for­má­cia­mi, kto­ré bu­de­me na­čí­ta­vať zo zvo­le­né­ho sú­bo­ru MD3 po­mo­cou ap­li­ká­cie MD3­loa­der. Pri kaž­dej ta­buľ­ke uve­die­me, kto­rej kon­krét­nej čas­ti zdro­jo­vé­ho kó­du ap­li­ká­cie sa da­né in­for­má­cie tý­ka­jú.

Po­dob­ne ako väč­ši­na dá­to­vých for­má­tov má aj for­mát MD3 ur­či­té vop­red sta­no­ve­né li­mi­ty pre množ­stvo uk­la­da­ných úda­jov. Tie­to li­mi­ty ta­kis­to uvád­za­me v ta­buľ­kách. V prí­pa­de, že vy­tvo­rí­me ob­jekt, kto­rý bu­de svo­ji­mi pa­ra­met­ra­mi pre­sa­ho­vať li­mi­ty for­má­tu MD3, ten ne­bu­de vy­tvo­re­ný ko­rek­tne, čo za­prí­či­ní, že na­ša ap­li­ká­cia ta­ký­to sú­bor ne­na­čí­ta správ­ne. S da­ným sú­bo­rom bu­dú mať prob­lé­my aj MD3 edi­to­ry, kto­ré ho buď ne­na­čí­ta­jú správ­ne, ale­bo ho ne­na­čí­ta­jú vô­bec. Pre­to je na vý­ro­bu sú­bo­rov MD3 vhod­né po­užiť pria­mo MD3 edi­tor, kto­rý by mal už v ča­se príp­ra­vy ob­jek­tu dodr­žia­vať sta­no­ve­né li­mi­ty.

Hla­vič­ka mo­de­lu MD3
Na za­čiat­ku kaž­dé­ho sú­bo­ru MD3 sa nac­hád­za tzv. hla­vič­ka mo­de­lu MD3 (MD3 hea­der), kto­rá ob­sa­hu­je zá­klad­né in­for­má­cie o ob­sa­hu sú­bo­ru MD3. V ap­li­ká­cii MD3­loa­der je tá­to hla­vič­ka na­čí­ta­va­ná po­mo­cou fun­kcie Load­Mo­del(); Z hla­vič­ky sú­bo­ru MD3 sú pre nás naj­dô­le­ži­tej­šie čí­sel­né úda­je o po­čte sní­mok, zna­čiek, sie­ťo­vých mo­de­lov a po­vr­chov a úda­je rep­re­zen­tu­jú­ce za­čia­tok ob­jek­tov Fra­mes, Tags a Sur­fa­ces.

tab1.jpg

Kaž­dý ob­jekt MD3, resp. mo­del MD3 ob­sa­hu­je tzv. sie­ťo­vé mo­de­ly (Sur­fa­ces) a tzv. znač­ky (Tags). Sie­ťo­vé mo­de­ly sú vy­tvo­re­né z kon­krét­nych vr­cho­lov, kto­rých vzá­jom­ným pre­po­je­ním vo for­me tro­ju­hol­ní­kov zís­ka­me po­ža­do­va­ný vzhľad ob­jek­tu (mo­de­lu). Ak po­ža­du­je­me, aby pa­ra­met­re náš­ho ob­jek­tu (naj­mä po­čet vr­cho­lov a z to­ho vy­plý­va­jú­ci po­čet tro­ju­hol­ní­kov) pre­siah­li li­mi­ty sta­no­ve­né for­má­tom MD3, ta­ký­to zlo­ži­tej­ší ob­jekt mô­že­me vy­tvo­riť zlo­že­ním via­ce­rých od­de­le­ných ob­jek­tov MD3. Ten/to prís­tup sa ne­pou­ží­va iba pre zlo­ži­té ob­jek­ty, ale z dô­vo­du zjed­no­du­še­nia aj pre jed­no­duc­hšie ob­jek­ty.

Aj pre­to sú úda­je o väč­ši­ne tzv. MD3 po­stáv (MD3 players) ulo­že­né v nas­le­du­jú­cej sku­pi­ne sú­bo­rov MD3:
 head.md3 – úda­je o „hla­ve“ po­sta­vy,
 up­per.md3 – úda­je o „hor­nej“ čas­ti po­sta­vy, tzv. tor­zo (tor­so),
 lower.md3 – úda­je o „dol­nej“ čas­ti po­sta­vy, tzv. no­hy (legs).

Na­čí­ta­nie uve­de­ných troch čas­tí po­sta­vy so sú­čas­ným na­čí­ta­ním ob­jek­tu „zbra­ne“ (weapon) sa reali­zu­je vo fun­kcii Load­Player(); V nej dôj­de po­stup­ne k na­čí­ta­niu ob­jek­tu pred­sta­vu­jú­ce­ho „hla­vu“, „hor­nú“ a „dol­nú“ časť po­sta­vy a ob­jek­tu „zbra­ne“. Po­tom dôj­de k na­čí­ta­niu po­vr­chov pre tie­to ob­jek­ty (Load­Skins();) a na­čí­ta­niu pa­ra­met­rov ani­má­cií (Loa­dA­nim();). Ale o tom až nes­kôr.

Tak­zva­né znač­ky (Tags) slú­žia na pre­po­je­nie (links) úda­jov na­čí­ta­ných z uve­de­ných sú­bo­rov. Ide o vzá­jom­né pre­po­je­nie jed­not­li­vých mo­de­lov for­mou od­ka­zov na iný mo­del. To­to sa vy­ko­ná­va vo fun­kcii Lin­kMo­del(); Vzá­jom­né pre­po­je­nie mo­de­lov má aj iný ako iba „konštrukč­ný“ vý­znam. Zme­na po­lo­hy a orien­tá­cie jed­not­li­vých mo­de­lov (jed­not­li­vých čas­tí mo­de­lov) je ob­sa­hom úda­jov pat­ria­cich ob­jek­tom Tags. To zna­me­ná, že po­hyb ob­jek­tu nie je de­fi­no­va­ný iba zme­nou po­lo­hy vr­cho­lov sie­ťo­vých mo­de­lov, z kto­rých sa skla­dá, ale po­hyb a ro­tá­cia sú de­fi­no­va­né aj v rám­ci znač­ky. Ob­jekt tak ne­mu­sí mať de­fi­no­va­né ani­má­cie, je­ho po­hyb je však stá­le zá­vis­lý od po­hy­bu znač­ky, ku kto­rej je pri­ra­de­ný. Pres­ved­čiť sa o tom mož­no naj­lep­šie sle­do­va­ním ob­jek­tu „hla­vy“, resp. ob­jek­tu „zbra­ne“, kto­ré štan­dar­dne ne­ma­jú de­fi­no­va­né ani­má­cie, ale ich po­hyb je zá­vis­lý od po­hy­bu znač­ky, ku kto­rej sú pri­ra­de­né.

Na­bu­dú­ce...
V nas­le­du­jú­cej č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 cha­rak­te­ris­ti­ku hla­vič­ky mo­de­lu MD3 a za­me­ria­me sa na hla­vič­ku sie­ťo­vých mo­de­lov.

Ďal­šie čas­ti >>

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