Programujeme grafický engine XXXI.

opengl_logo.jpg Tým­to člán­kom sa po­ma­ly dos­tá­va­me k zá­ve­ru cel­ku, v kto­rom sme sa za­obe­ra­li si­mu­lá­ciou fy­zi­ky. Zos­tá­va nám opí­sať prin­cíp de­tek­cie ko­lí­zií a uviesť spô­sob reak­cie si­mu­lač­né­ho sys­té­mu na de­te­go­va­né ko­lí­zie.

De­tek­cia ko­lí­zií
Pri rie­še­ní ko­lí­zií pot­re­bu­je­me poz­nať cha­rak­te­ris­ti­ku všet­kých bo­dov, v kto­rých nas­ta­la ko­lí­zia (colli­sion points). Cha­rak­te­ris­ti­kou ko­líz­nych bo­dov ro­zu­mie­me ich po­lo­hu, tzv. ko­líz­ne nor­má­ly a rých­los­ti. Po­lo­ha ko­líz­nych bo­dov je ur­če­ná re­la­tív­ne k po­lo­he stre­du (ťa­žis­ka) pev­né­ho te­le­sa. V ta­kom­to prí­pa­de ho­vo­rí­me o sú­rad­ni­ciach v tzv. pries­to­re te­le­sa = lo­kál­ne sú­rad­ni­ce (bo­dy spa­ce coords). Prís­luš­nou tran­sfor­mač­nou ma­ti­cou pre­vá­dza­me lo­kál­ne sú­rad­ni­ce na glo­bál­ne (world spa­ce coords). Ko­líz­ne nor­má­ly sú naj­čas­tej­šie kol­mi­ca­mi na povrch te­le­sa v ko­líz­nych bo­doch. Rých­losť ko­líz­nych bo­dov pred ko­lí­ziou vy­po­čí­ta­me na zá­kla­de nám zná­me­ho vzťa­hu – súč­tom pria­mo­čia­rej (li­near) a uh­lo­vej (an­gu­lar) rých­los­ti bo­dov (vr­cho­lov) pa­tria­cich pev­né­mu te­le­su.

Poz­ná­me via­ce­ro jed­no­du­chých, ale aj zlo­ži­tých al­go­rit­mov de­tek­cie ko­lí­zií, ur­če­ných na vý­po­čet cha­rak­te­ris­ti­ky ko­líz­nych bo­dov. Jed­no­du­ché al­go­rit­my čas­to vy­uží­va­jú prin­cíp tzv. de­lia­cich ro­vín (se­pa­ra­tion pla­nes), resp. de­le­nie pev­ných te­lies na men­šie čas­ti až čas­ti­ce (par­tic­les). Tie­to al­go­rit­my sa vy­zna­ču­jú rých­los­ťou, čas­to však ne­po­nú­ka­jú po­ža­do­va­ný vi­zuál­ny vzhľad a neu­mož­ňu­jú ver­ne si­mu­lo­vať všet­ky fy­zi­kál­ne ja­vy. Nao­pak, pou­ži­tím zlo­ži­tej­ších al­go­rit­mov do­ká­že­me ver­ne si­mu­lo­vať tak­mer všet­ky fy­zi­kál­ne ja­vy vrá­ta­ne tzv. zos­ku­po­va­nia ob­jek­tov (stac­king), si­mu­lá­cie prí­rod­ných ja­vov, ale napr. aj ná­sil­né­ho de­le­nia te­lies. Zlo­ži­tá de­tek­cia ko­lí­zií je však ná­roč­nej­šia na ma­te­ma­tic­ké vý­poč­ty, na vý­kon pou­ži­té­ho har­dvé­ru a v ne­pos­led­nom ra­de má väč­šie ná­ro­ky na ve­do­mos­ti vý­vo­já­rov.

Rie­še­nie ko­lí­zií
Rie­še­nie ko­lí­zií je vo sve­te fy­zi­kál­nych si­mu­lá­cií reali­zo­va­né ap­li­ko­va­ním im­pul­zov v ko­líz­nych bo­doch, čím do­chá­dza k okam­ži­tej zme­ne rých­los­ti pev­ných te­lies. V prí­pa­de za­ned­ba­nia tre­nia ap­li­ku­je­me v sme­re ko­líz­nej nor­má­ly im­pulz:

J = j * n(t0) 

engine obr1.bmp

Obr. 1 Ap­li­ká­cia im­pul­zu na pev­né te­le­sá v ko­lí­zii

Na jed­no z ko­li­du­jú­cich te­lies ap­li­ku­je­me klad­ný im­pulz, na dru­hé zá­por­ný. Je­di­ná nez­ná­ma pri vý­poč­te im­pul­zu je pa­ra­me­ter j, kto­rý udá­va veľ­kosť (mag­ni­tu­de) im­pul­zu. Na de­fi­ní­ciu vzťa­hu na vý­po­čet pa­ra­met­ra j vy­uži­je­me nas­le­du­jú­ce vzťa­hy:

v0 = n(t0) . ( vpred_a(t0) – vpred_b(t0) ), v1 = n(t0) . ( vpo_a(t0) – vpo_b(t0) )
v1 = - Є * v0
	v0, v1 – re­la­tív­ne 
rých­los­ti te­lies v sme­re ko­líz­nej nor­má­ly pred a po ap­li­ko­va­ní im­pul­zu
	vpred_a, vpred_b, vpo_a, vpo_b – rých­los­ti ko­líz­nych bo­dov te­lies pred a po ap­li­ko­va­ní im­pul­zu
	Є – koe­fi­cient ob­no­vy (coef­fi­cient of res­ti­tu­tion – COR), Є = < 0 ; 1 >

engine obr2.bmp

Obr. 2 Zme­na rých­los­ti ko­líz­nych bo­dov pev­ných te­lies v zá­vis­los­ti od COR

vpo_a(t0) = vpo_a(t0) + ωpo_a(t0) x ra
	vpo_a – rých­losť ko­líz­ne­ho bo­du 1. te­le­sa je zlo­že­ná z pria­mo­čia­rej a uh­lo­vej zlož­ky
	vpo_a(t0) = vpred_a(t0) + ( j * n(t0) ) / Ma – pria­mo­čia­ra zlož­ka rých­los­ti ko­líz­ne­ho bo­du
	ωpo_a(t0) = ωpred_a(t0) + Ia-1(t0) * ( ra x j * n(t0) ) – uh­lo­vá zlož­ka rých­los­ti ko­líz­ne­ho bo­du
	Ia-1 – in­verz­ný ten­zor zotr­vač­nos­ti (in­ver­se iner­tia ten­sor) 1. te­le­sa
	Ma – hmot­nosť 1. te­le­sa
	ra – re­la­tív­na po­lo­ha ko­líz­ne­ho bo­du vo vzťa­hu k stre­du (ťa­žis­ku) 1. te­le­sa

Rov­na­ký vzťah – sa­moz­rej­me so zme­ne­ný­mi koe­fi­cien­tmi – vy­jad­rí­me aj pre 2. te­le­so. Po­tom do­sa­de­ním do rov­ni­ce v1 = - Є * v0 a vy­ko­na­ním zjed­no­du­šu­jú­cich úp­rav zís­ka­me nas­le­du­jú­ce vzťa­hy:

v1 = v0 + j * ( 1/Ma + 1/Mb + n(t0) . ( Ia-1(t0) * ( ra x n(t0) ) ) x ra + n(t0) . ( Ib-1(t0) * ( rb x n(t0) ) ) x rb )
j = -(1 + Є) * v0 / ( 1/Ma + 1/Mb + n(t0) . ( Ia-1(t0) * ( ra x n(t0) ) ) x ra + n(t0) . ( Ib-1(t0) * ( rb x n(t0) ) ) x rb )

Zís­ka­ný vzťah na vý­po­čet veľ­kos­ti im­pul­zu je sí­ce po­mer­ne dl­hý a na pr­vý poh­ľad nez­ro­zu­mi­teľ­ný, ale bez vá­ha­nia sa dá naz­vať „sr­dcom“ ko­líz­ne­ho sys­té­mu. Po vy­ko­na­ní de­tek­cie ko­lí­zií a ur­če­ní cha­rak­te­ris­ti­ky ko­líz­nych bo­dov hod­no­tu j pou­ži­je­me na vý­po­čet im­pul­zov. Tie nás­led­ne ap­li­ku­je­me na obe te­le­sá v ko­lí­zii, čím dôj­de k pot­reb­nej zme­ne ich rých­los­tí.

Na­bu­dú­ce...
V bu­dú­cej čas­ti se­riá­lu sa ko­neč­ne dos­ta­ne­me k prak­tic­kej ukáž­ke všet­kých do­po­siaľ zhro­maž­de­ných ve­do­mos­tí. Pos­ta­ví­me si­mu­lač­ný sys­tém im­ple­men­tu­jú­ci de­tek­ciu a rie­še­nie ko­lí­zií pev­ných te­lies.

Ďal­šie čas­ti >>

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