Programujeme grafický engine XXI.

opengl_logo.jpg Po­čnúc tou­to čas­ťou se­riá­lu bu­de­me pra­vi­del­ne dopĺňať vzo­ro­vú ap­li­ká­ciu o no­vý kód, kto­rý vždy krát­ko opí­še­me. Kom­ple­ti­zo­va­ním jed­no­duch­ších čas­tí kó­du bu­de­me po­stup­ne vy­tvá­rať funkč­ný en­gi­ne so všet­ký­mi je­ho vlas­tnos­ťa­mi.

Sve­tel­né ma­py a de­tek­cia ko­lí­zií
Vzo­ro­vá ap­li­ká­cia En­gi­ne v1.3, kto­rá je príl­ohou tej­to čas­ti se­riá­lu, im­ple­men­tu­je sve­tel­né ma­py a po­mer­ne kom­plexnú de­tek­ciu ko­lí­zií. Tie­to dve na pr­vý po­hľad ne­sú­vi­sia­ce té­my ma­jú ve­ľa spo­loč­né­ho. Pri vý­poč­te od­tie­ňa jed­not­li­vých lu­me­lov sve­tel­ných máp tes­tu­je­me ko­lí­ziu sve­tel­ných lú­čov a tro­ju­hol­ní­kov. V prí­pa­de de­tek­cie ko­lí­zie ava­ta­ra s tro­ju­hol­ník­mi po­stu­pu­je­me po­dob­ne.

Al­go­rit­mus de­tek­cie ko­lí­zií sme už raz opí­sa­li, a to v pô­vod­nom se­riá­li o po­uží­va­ní OpenGL. Ap­li­ká­cia En­gi­ne v1.3 však pô­vod­ný al­go­rit­mus roz­ši­ru­je o via­ce­ré pr­vky sú­vi­sia­ce so si­mu­lá­ciou fy­zi­kál­nych ja­vov, ako je napr. zrýc­hle­nie, pô­so­be­nie gra­vi­tá­cie, skok, úk­lon atď.

Fy­zi­ka en­gi­nu
Pri prog­ra­mo­va­ní fy­zi­kál­nych ja­vov sú­vi­sia­cich s po­hy­bom ava­ta­ra vy­chád­za­me z bež­ných ma­te­ma­tic­ko-fy­zi­kál­nych vzťa­hov pre po­hyb bo­du v 3D pries­to­re. Je sa­moz­rej­mé, že jed­not­li­vé vý­poč­ty idea­li­zu­je­me a sna­ží­me sa ich v maximál­nej mie­re zjed­no­du­šiť. Ta­kis­to je zrej­mé, že nie všet­ky fy­zi­kál­ne ja­vy sku­toč­né­ho sve­ta do­ká­že­me ver­ne si­mu­lo­vať po­mo­cou jed­no­du­chých po­čí­ta­čo­vých al­go­rit­mov. Ho­ci po­čí­ta­čo­vý čas mož­no pri­rov­nať k reál­ne­mu ča­su, ťaž­ko mô­že­me v scé­ne od­me­rať reál­nu dĺžku. Prí­ras­tok po­čí­ta­čo­vé­ho ča­su je zá­vis­lý od rých­los­ti, akou je CPU/GPU toh­to po­čí­ta­ča schop­ný vy­ko­nať za­da­né inštruk­cie. Ak k uve­de­ným roz­die­lom dopl­ní­me ďal­šie ob­med­ze­nia, na kto­ré na­ra­zí­me pri sna­he o čo naj­reál­nej­šie na­po­do­be­nie fy­zi­kál­nych ja­vov, dos­pe­je­me k zá­ve­ru, že ur­či­tú časť týc­hto ja­vov ne­do­ká­že­me do­ko­na­le al­go­rit­mi­zo­vať, a tak sa k reali­te mô­že­me iba prib­lí­žiť.

Po­hyb ava­ta­ra
Zá­kla­dom fy­zi­kál­nych ja­vov sú­vi­sia­cich s po­hy­bom ava­ta­ra (po­sta­vy v si­mu­lo­va­nom 3D sve­te) je prí­ras­tok pre zme­nu po­lo­hy ava­ta­ra – pre­men­ná mo­ve v rám­ci mo­du­lu Ava­tar (ava­tar.cpp, ava­tar.h). Tá­to pre­men­ná rep­re­zen­tu­je drá­hu, kto­rú prej­de ava­tar za da­ný čas. Na vý­po­čet zrýc­hle­nia/spo­ma­le­nia ava­ta­ra sa po­uží­va jed­no­duc­hší li­neár­ny vzťah, kto­rý je však rov­na­ko zá­vis­lý od up­ly­nu­té­ho ča­su. Do­siah­ne­me tak rov­na­ké zrýc­hle­nie/spo­ma­le­nie ava­ta­ra pri rôz­nych FPS, pri­čom vi­zuál­ny do­jem je tak­mer rov­na­ký ako pri po­uži­tí kvad­ra­tic­kej fun­kcie.

Rov­na­ký po­stup by sme moh­li po­užiť aj pri vý­poč­te pô­so­be­nia gra­vi­tá­cie, ale z dô­vo­du ukáž­ky ma­te­ma­tic­ky správ­ne­ho vý­poč­tu sme ten­to kon­krét­ny vý­po­čet reali­zo­va­li tak, ako to pred­pi­su­jú prís­luš­né vzťa­hy. Drá­ha, kto­rú prej­de ava­tar, je v ta­kom­to prí­pa­de pria­mo úmer­ná štvor­cu ča­su (s = 1/2 . g . t2).

Kvad­ra­tic­ký a li­neár­ny prie­beh de­ja
Pre­to­že sme sa roz­hod­li na vý­po­čet sko­ku/pô­so­be­nia gra­vi­tá­cie po­užiť neup­ra­ve­ný ma­te­ma­tic­ko-fy­zi­kál­ny vzťah, bu­de­me sa mu­sieť vy­rov­nať s prob­lé­mom rôz­ne­ho po­čtu FPS. Je zrej­mé, že ap­li­ká­cia bež­iaca na rôz­nych PC bu­de vy­ko­ná­va­ná rôz­ny­mi CPU/GPU, a te­da bu­de bež­ať s rôz­ny­mi FPS. To zna­me­ná, že prís­luš­né čas­ti kó­du bu­dú za da­ný čas vy­ko­na­né rôz­ny po­čet krát. Vý­po­čet prie­be­hu sko­ku/pá­du bu­de ge­ne­ro­vať roz­diel­ne vi­zuál­ne vý­stu­py (vý­ška sko­ku ava­ta­ra rov­na­ko ako hĺbka je­ho pá­du bu­de roz­diel­na).

engine1.jpg
Obr. 1 Ava­tar vy­sko­čil na koc­ku

Rie­še­nie je za­lo­že­né na sku­toč­nos­ti, že fun­kcia up­da­te() sa pri 50 FPS vy­ko­ná 50-krát, pri 100 FPS 100-krát, pri 150 FPS 150-krát atď. Koe­fi­cien­ty uve­de­nej kvad­ra­tic­kej fun­kcie sa pri 50 FPS vy­po­čí­ta­jú a nav­zá­jom sčí­ta­jú 50-krát, pri 100 FPS 100-krát atď. Ak chce­me do­siah­nuť rov­na­kú vý­šku sko­ku/hĺbku pá­du ava­ta­ra, mu­sí­me za­bez­pe­čiť, aby sa uve­de­né súč­ty koe­fi­cien­tov rov­na­li, a to pre aké­koľ­vek FPS. Prak­tic­ké rie­še­nie mož­no naš­tu­do­vať zo vzo­ro­vej ap­li­ká­cie, kde sú všet­ky čas­ti po­drob­ne oko­men­to­va­né.

Na­bu­dú­ce...
V bu­dú­cej čas­ti se­riá­lu do­kon­čí­me ob­lasť si­mu­lá­cie fy­zi­kál­nych ja­vov a uve­die­me zo­pár dopl­ňu­jú­cich in­for­má­cií o ap­li­ko­va­nej de­tek­cii ko­lí­zií. Sa­moz­rej­mé je roz­ší­re­nie vzo­ro­vej ap­li­ká­cie o no­vú fun­kcio­na­li­tu.

Ďal­šie čas­ti >>

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