Programujeme grafický engine XXXII.

opengl_logo.jpg Tou­to čas­ťou se­riá­lu ukon­čí­me té­mu im­ple­men­tá­cie fy­zi­kál­nych zá­ko­nov v rám­ci gra­fic­kých en­gi­nov. Všet­ky ve­do­mos­ti, kto­rý­mi v tom­to oka­mi­hu dis­po­nu­je­me, vy­uži­je­me na príp­ra­vu prak­tic­ké­ho prík­la­du.

Fy­zi­ka v ap­li­ká­cii En­gi­ne v2.3

Príl­ohou toh­to člán­ku je zdro­jo­vý kód ap­li­ká­cie En­gi­ne vo ver­zii 2.3. Pô­vod­ný kód sme dopl­ni­li o mo­du­ly PhWall (phwall.h, phwall.cpp), Ri­gid­Bo­dy (RB.h, RB.cpp) a Colli­sion­De­tec­tion (RBcolli­sions.h, Rbcolli­sions.cpp). Uve­de­né mo­du­ly ob­sa­hu­jú všet­ky fun­kcie po­treb­né na si­mu­lá­ciu fy­zi­ky pev­ných te­lies.

engine obr1.bmp
Obr. 1 Pô­vod­ná ap­li­ká­cia dopl­ne­ná o fy­zi­ku pev­ných te­lies

PhWall

Mo­dul PhWall pred­sta­vu­je roz­hra­nie med­zi pô­vod­ným a no­vým kó­dom ap­li­ká­cie. Trie­da CPhWall (múr) ob­sa­hu­je de­fi­no­va­ný po­čet ob­jek­tov CPhBrick (teh­la), kto­ré pred­sta­vu­jú pev­né te­le­sá, a ta­kis­to dek­la­rá­ciu pre­men­nej trie­dy CColli­sion­De­tec­tion, po­mo­cou kto­rej ap­li­ká­cia reali­zu­je de­tek­ciu a rie­še­nie ko­lí­zií.
V rám­ci mo­du­lu PhWall je ok­rem iné­ho rie­še­ná aj reak­cia na streľ­bu Ava­ta­ra (na za­čiat­ku fun­kcie draw()). Streľ­ba za­prí­či­ňu­je vznik im­pul­zov, kto­ré sú ap­li­ko­va­né na za­siah­nu­té te­le­sá (fun­kcia Streľ­ba zá­ro­veň spô­so­bu­je tvor­bu od­tlač­kov (di­er po guľ­kách), kto­ré sú v tom­to prí­pa­de kres­le­né tým naj­jed­no­duc­hším spô­so­bom - úp­ra­vou textúr pat­ria­cich jed­not­li­vým te­le­sám.

engine obr2.bmp
Obr. 2 De­tail­né zob­ra­ze­nie neak­tív­nych pev­ných te­lies s di­era­mi po guľ­kách

Ri­gid­Bo­dy

Ten­to mo­dul ob­sa­hu­je de­fi­ní­cie všet­kých fun­kcií po­treb­ných na sprá­vu pa­ra­met­rov pev­ných te­lies. Ok­rem to­ho ob­sa­hu­je fun­kciu in­teg­ra­te(), kto­rá je „sr­dcom" si­mu­lač­né­ho al­go­rit­mu. V tej­to fun­kcii sa pre kaž­dý ča­so­vý oka­mih vy­po­čí­ta­va­jú úda­je sta­vo­vé­ho vek­to­ra (po­lo­ha, pria­mo­čia­ra, uh­lo­vá rých­losť, na­to­če­nie a ten­zor zotr­vač­nos­ti pev­né­ho te­le­sa).

Colli­sion­De­tec­tion

Mo­dul Colli­sion­De­tec­tion je roz­de­le­ný na dve čas­ti:

1. De­tek­cia ko­lí­zií - ap­li­ká­cia im­ple­men­tu­je tri­viál­ny al­go­rit­mus de­tek­cie ko­lí­zií, kto­rý pl­ní po­ža­do­va­nú fun­kciu, ho­ci má via­ce­ro ob­med­ze­ní. Je­ho zá­kla­dom je po­rov­ná­va­nie vzdia­le­nos­ti stre­du pev­né­ho te­le­sa od ro­vi­ny, pri­čom sa be­rú do úva­hy ďal­šie pa­ra­met­re, kto­ré spo­loč­ne ov­plyv­ňu­jú vý­sle­dok de­tek­cie. Dô­le­ži­tým vý­stu­pom de­te­go­va­nej ko­lí­zie sú úda­je o po­lo­he ko­líz­ne­ho bo­du, sme­re ko­líz­nej nor­má­ly a hĺbke prie­ni­ku (pe­net­ra­tion) jed­né­ho te­le­sa do dru­hé­ho. Vý­sled­ky sa uk­la­da­jú do vop­red prip­ra­ve­né­ho po­ľa (CColli­sion col[MAX_COLLI­SIONS]).

2. Rie­še­nie ko­lí­zií - reali­zu­je sa po­mo­cou im­pul­zov a je gra­nu­lo­va­né na dve čas­ti:

a) úp­ra­va po­lo­hy a na­to­če­nia ko­li­du­jú­cich te­lies - fun­kcia chan­ge_s_R(),
b) úp­ra­va rých­los­tí ko­li­du­jú­cich te­lies - fun­kcia chan­ge_v_w().

Ap­li­ká­cia im­ple­men­tu­je tzv. me­tó­du lo­kál­nej po­ku­ty (lo­cal pe­nal­ty met­hod) vo fun­kcii Pri tej­to me­tó­de je do­vo­le­né, aby pev­né te­le­sá ko­li­do­va­li, pri­čom nie je vy­po­čí­ta­va­ná pres­ná po­lo­ha vr­cho­lu, v kto­rom te­le­sá ko­li­do­va­li, ani pres­ný čas ko­lí­zie. Ko­lí­zie te­da nas­tá­va­jú a až nás­led­ne sa riešia po­mo­cou im­pul­zov.

To je v kon­tras­te s iný­mi me­tó­da­mi rie­še­nia ko­lí­zií, kto­ré po­uží­va­jú ove­ľa so­fis­ti­ko­va­nej­šie al­go­rit­my. Ich zá­kla­dom je zväč­ša vý­po­čet všet­kých síl pô­so­bia­cich na všet­ky te­le­sá v kaž­dom ča­so­vom oka­mi­hu si­mu­lá­cie. Do úva­hy sa be­rie ce­lý fy­zi­kál­ny sys­tém ako je­den ce­lok. Prá­ve ta­ké­to me­tó­dy rie­še­nia ko­lí­zií sú jad­rom väč­ši­ny ko­mer­čných fy­zi­kál­nych en­gi­nov.

Pre­to­že na­ša ap­li­ká­cia po­uží­va jed­no­duc­hý al­go­rit­mus, nie je vhod­ná na tzv. uk­la­da­nie (stac­king) pev­ných te­lies. Al­go­rit­mus je však veľ­mi rých­ly, jed­no­duc­hý na po­cho­pe­nie, a čo je pre nás naj­dô­le­ži­tej­šie, ap­li­ku­je všet­ky teo­re­tic­ké as­pek­ty fy­zi­kál­nych si­mu­lá­cií, kto­rým sme sa do­po­siaľ ve­no­va­li. Je pl­ne po­sta­ču­jú­ci na si­mu­lá­ciu pev­ných te­lies po­lo­že­ných na ro­vin­nej ploc­he, resp. na si­mu­lá­ciu rôz­nych deš­truk­čných efek­tov.

Na­bu­dú­ce...

V bu­dú­cej čas­ti se­riá­lu po­uži­tý al­go­rit­mus si­mu­lá­cie fy­zi­ky pev­ných te­lies roz­ší­ri­me o nie­koľ­ko drob­ných pr­vkov, po­mo­cou kto­rých bu­de­me si­mu­lo­vať deš­truk­ciu ob­jek­tov. Zá­ro­veň uká­že­me, ako mož­no do her­né­ho en­gi­nu in­teg­ro­vať zr­kad­lá.

Ďal­šie čas­ti >>

Zdroj: Infoware 12/2010



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