Programujeme grafický engine XXII.

opengl_logo.jpg Ten­to­raz do­kon­čí­me opis al­go­rit­mov si­mu­lu­jú­cich fy­zi­kál­ne ja­vy sú­vi­sia­ce s po­hy­bom ava­ta­ra. V dru­hej po­lo­vi­ci člán­ku sa bu­de­me v struč­nos­ti ve­no­vať im­ple­men­to­va­né­mu al­go­rit­mu de­tek­cie ko­lí­zií.

Skok/pád
V pre­doš­lej čas­ti se­riá­lu sme opí­sa­li zá­klad­ný prin­cíp si­mu­lá­cie sko­ku/pá­du ava­ta­ra. S tým­to ja­vom je spo­je­ný nie­len vý­po­čet po­lo­hy ava­ta­ra v da­ných ča­so­vých oka­mi­hoch, ale aj spô­sob, ako je de­te­go­va­ná ko­lí­zia ava­ta­ra s ob­jek­tmi scé­ny.

Nap­rog­ra­mo­vať jed­no­duc­hú fun­kciu si­mu­lu­jú­cu skok/pád je po­mer­ne jed­no­duc­hé. Is­té prob­lé­my však nas­ta­nú v oka­mi­hu de­tek­cie ko­lí­zií, a to naj­mä s tro­ju­hol­ník­mi, kto­ré sa nac­hád­za­jú nad ava­ta­rom. Pri im­ple­men­to­va­ní al­go­rit­mu de­tek­cie ko­lí­zií však ur­či­te na­ra­zí­me aj na ďal­šie spor­né mies­ta, na kto­rých sa ava­tar mô­že/ne­mô­že nac­hád­zať. Ale o tom až nes­kôr.

Krá­ča­nie/úk­lo­ny
Na do­siah­nu­tie čo naj­reál­nej­šie­ho vi­zuál­ne­ho doj­mu mno­hé mo­der­né en­gi­ny si­mu­lu­jú krá­ča­nie ava­ta­ra pri po­hy­be v scé­ne, a to for­mou cyk­lic­kých úk­lo­nov ava­ta­ra od zvis­lej osi. Al­go­rit­mus je jed­no­duc­hý, ale zlo­ži­tej­šia je je­ho in­teg­rá­cia s os­tat­ný­mi al­go­rit­ma­mi. Sa­moz­rej­má je zá­vis­losť nak­lá­ňa­nia od FPS, na čo ne­mô­že­me za­bud­núť pri žiad­nom ča­so­vo zá­vis­lom po­hy­be. Ta­kis­to nes­mie­me za­bud­núť na niek­to­ré špe­ci­fic­ké sta­vy, ako je napr. za­sta­ve­nie si­mu­lá­cie krá­ča­nia v prí­pa­de, že ava­tar ská­če.

engine1.jpg
Obr. 1 Ava­tar nak­lo­ne­ný cez roh ste­ny

V prí­pa­de úk­lo­nov je prob­le­ma­tic­kej­šia časť správ­ne ap­li­ko­va­nie ro­tá­cie ava­ta­ra, resp. scé­ny tak, aby bol vý­sled­ný efekt čo naj­reál­nej­ší. Opí­sa­né al­go­rit­my si­mu­lu­jú­ce krá­ča­nie/úk­lo­ny sa nac­hád­za­jú na kon­ci fun­kcie up­da­te() a sú ako oby­čaj­ne po­drob­ne oko­men­to­va­né.

De­tek­cia ko­lí­zií
Na­ko­niec sa dos­tá­va­me k té­me de­tek­cie ko­lí­zií, s kto­rou sme sa už stret­li, tak­že nám ur­či­te nie je nez­ná­ma. Pô­vod­ný jed­no­duc­hý al­go­rit­mus sme však prep­ra­co­va­li tak, aby zoh­ľad­ňo­val väč­šie množ­stvo ko­líz­nych sta­vov a pri­tom stá­le fun­go­val tak, ako to po­ža­du­je­me.

engine2.jpg
Obr. 2 Po­lo­ha nôh a očí ava­ta­ra v dos­tup­nom pries­to­re scé­ny

Al­go­rit­mus je roz­de­le­ný na dva cel­ky:
1. test s tro­ju­hol­ník­mi, kto­ré sú k ava­ta­ro­vi priv­rá­te­né,
2. test s od­vrá­te­ný­mi tro­ju­hol­ník­mi.

Dru­hý prí­pad je jed­no­duc­hší. Ava­tar sa po­hol tak, že je­ho no­vá po­lo­ha je za kon­krét­nym tro­ju­hol­ní­kom. V prí­pa­de ko­lí­zie tre­ba vy­po­čí­tať no­vú po­lo­hu ava­ta­ra tak, aby sa po­su­nul pred „ko­líz­ny“ tro­ju­hol­ník. V pr­vom prí­pa­de je po­treb­né vziať do úva­hy tri rôz­ne ob­jek­ty, kto­ré rep­re­zen­tu­je da­ný tro­ju­hol­ník:
1. po­dla­ha – ava­tar po ta­kýc­hto tro­ju­hol­ní­koch krá­ča,
2. ste­ny – ava­tar do tro­ju­hol­ní­kov na­rá­ža,
3. strop – ava­tar na­rá­ža, ale nas­ta­via sa rov­na­ké sta­vy ako v pr­vom prí­pa­de.

engine3.jpg
Obr. 3 Rôz­ne vý­poč­ty po­lo­hy ava­ta­ra po de­te­go­va­nej ko­lí­zii

Prak­tic­kú ap­li­ká­ciu mož­no náj­sť v mo­du­le Ava­tar a je­ho fun­kcii de­tec­tColli­sion(). Na dopl­ne­nie uve­die­me, že v pr­vom zo spo­mí­na­ných prí­pa­dov je test vy­ko­na­ný s bo­dom, v kto­rom sa nac­hád­za­jú „no­hy“ ava­ta­ra. V dru­hom prí­pa­de sa tes­tu­jú dva bo­dy – pr­vý bod pred­sta­vu­je „no­hy“ ava­ta­ra, dru­hý pred­sta­vu­je „vý­šku očí“ ava­ta­ra. Na­ko­niec v tre­ťom prí­pa­de sa tes­tu­je bod, v kto­rom sa nac­hád­za­jú „oči“ ava­ta­ra. Po­mo­cou uve­de­né­ho po­stu­pu mož­no po­mer­ne jed­no­duc­ho vy­ko­nať sku­pi­nu inak veľ­mi zlo­ži­tých tes­tov. De­tek­cia ko­lí­zií sa v sú­čas­nej ver­zii ap­li­ká­cie vy­ko­ná­va so všet­ký­mi tro­ju­hol­ník­mi. Ten­to stav však v niek­to­rej z bu­dú­cich ver­zií zme­ní­me a tro­ju­hol­ní­ky ulo­ží­me do štruk­tú­ry, kto­rá bu­de efek­tív­nej­šia na do­siah­nu­tie po­treb­né­ho vý­ko­nu.

Na­bu­dú­ce...
Na­bu­dú­ce bu­de­me po­kra­čo­vať v zlep­šo­va­ní vzhľa­du a dopĺňa­ní fun­kcií ap­li­ká­cie. Scé­nu dopl­ní­me o no­vé ob­jek­ty a ava­ta­ro­vi umož­ní­me vy­ko­ná­vať no­vé čin­nos­ti.

Ďal­šie čas­ti >>

Zdroj: Infoware 12/2009



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