Programujeme grafický engine XXIX.

opengl_logo.jpg V po­mer­ne od­ľah­če­nom úvo­de sme sa iba ok­ra­jo­vo dotk­li fy­zi­ky (phy­sics) im­ple­men­to­va­nej v mo­der­ných po­čí­ta­čo­vých ap­li­ká­ciách a en­gi­noch. Po­čnúc tou­to čas­ťou se­riá­lu sa za­čne­me spo­me­nu­tej té­me ve­no­vať napl­no. Bu­de­me vy­chád­zať zo zá­klad­ných zá­ko­nov mec­ha­ni­ky, dy­na­mi­ky a ki­ne­ma­ti­ky, pris­pô­so­be­ných po­dmien­kam po­čí­ta­čo­vé­ho sve­ta. Té­ma po­uži­tia vy­bra­ných zá­ko­nov fy­zi­ky v gra­fic­kých en­gi­noch je ob­sa­hom mno­hých pub­li­ká­cií a da­li by sa o nej na­pí­sať stov­ky až ti­síc­ky strán. Pre­to je jas­né, že všet­ky zná­me fak­ty bu­de­me mu­sieť v maximál­nej mie­re zos­truč­niť.

Pev­né te­le­sá (Ri­gid Bo­dy – RB)
Pri fy­zi­kál­nej si­mu­lá­cii po­hy­bu troj­roz­mer­ných RB bu­de­me vždy vy­chád­zať z troch zá­klad­ných pred­pok­la­dov:
1. Všet­ky RB ma­jú svoj pries­to­ro­vý ob­jem (spa­tial vo­lu­me) a hmot­nosť (mass).
2. Tvar RB je sí­ce de­fi­no­va­ný ne­ko­neč­ným po­čtom 3D vr­cho­lov (po­ints) tvo­ria­cich je­ho po­vrch, ale fy­zi­kál­ne vý­poč­ty bu­de­me vy­ko­ná­vať iba s ko­neč­ným po­čtom vr­cho­lov (napr. vr­cho­ly kvád­ra, „vr­cho­ly“ gu­le, ih­la­na...).
3. RB ko­li­du­jú (colli­de) s iný­mi RB ale­bo všeo­bec­ne so všet­ký­mi ob­jek­tmi de­fi­no­va­ný­mi v scé­ne – do ob­je­mu RB ne­mô­že vnik­núť iné te­le­so (non-pe­net­ra­ting).
Naj­skôr sa bu­de­me ve­no­vať všeo­bec­né­mu po­hy­bu RB bez ob­med­ze­ní (un­constrai­ned). Na do­siah­nu­tie reál­ne­ho doj­mu však bu­de­me mu­sieť nes­kôr voľ­ný po­hyb RB ob­med­ziť (constrai­ned), a to po­mo­cou de­tek­cie ko­lí­zií. Pri si­mu­lá­cii po­hy­bu RB po­uži­je­me nám zná­me zá­klad­né úda­je de­fi­nu­jú­ce po­lo­hu a rých­losť hmot­ných bo­dov (vr­cho­lov RB). V prí­pa­de RB však tie­to úda­je dopl­ní­me o na­to­če­nie RB a in­for­má­ciu o roz­lo­že­ní je­ho hmo­ty.

Sta­vo­vý vek­tor RB
Na rie­še­nie ča­so­vo zá­vis­lé­ho po­hy­bu RB po­mo­cou ODE a Eule­ro­vej me­tó­dy po­uží­va­me nas­le­du­jú­ci sta­vo­vý vek­tor (sta­te vec­tor):

Y(t) = ( s(t), R(t), P(t), L(t) ) 
Sta­vo­vý vek­tor RB v kaž­dom oka­mi­hu si­mu­lá­cie po­sky­tu­je zá­klad­né úda­je oh­ľa­dom ak­tuál­ne­ho sta­vu RB:
 s(t) a R(t) sú pries­to­ro­vé úda­je (spa­tial in­for­ma­tion) de­fi­nu­jú­ce po­lo­hu a na­to­če­nie RB v da­nom ča­so­vom oka­mi­hu, pri rie­še­ní ODE po­tre­bu­je­me po­znať pr­vé de­ri­vá­cie týc­hto pa­ra­met­rov, kto­ré sú nas­le­du­jú­ce:
s(t)' = v(t) – de­ri­vá­cia po­lo­hy po­dľa ča­su sa rov­ná pria­mo­čia­rej rých­los­ti (li­near ve­lo­ci­ty),
R(t)' = ω(t) * R(t) – de­ri­vá­cia ma­ti­ce na­to­če­nia (ro­ta­tion mat­rix) po­dľa ča­su sa rov­ná ska­lár­ne­mu sú­či­nu vek­to­ra uh­lo­vej rých­los­ti (an­gu­lar ve­lo­ci­ty) a ma­ti­ce na­to­če­nia,
 P(t) a L(t) pred­sta­vu­jú pria­mo­čia­ru (li­near) a uh­lo­vú (an­gu­lar) hyb­nosť (mo­men­tum) RB, kto­rých pr­vé de­ri­vá­cie sú nas­le­du­jú­ce:
P(t)' = F(t) – de­ri­vá­cia pria­mo­čia­rej hyb­nos­ti po­dľa ča­su sa rov­ná cel­ko­vej si­le (for­ce) pô­so­bia­cej na RB,
L(t)' = τ(t) – de­ri­vá­cia uh­lo­vej hyb­nos­ti po­dľa ča­su sa rov­ná cel­ko­vé­mu krú­tia­ce­mu mo­men­tu (torque) pô­so­bia­ce­mu na RB.

Ďal­šie pre­men­né
Pri rie­še­ní ODE mu­sí­me po­znať nie­koľ­ko ďal­ších vzťa­hov na vý­po­čet dopl­nko­vých úda­jov po­treb­ných na beh si­mu­lá­cie. Vý­sled­nú po­do­bu uvád­za­ných vzťa­hov mož­no zís­kať pat­rič­nou úp­ra­vou zá­klad­ných rov­níc, kto­ré ma­jú pô­vod v zá­klad­ných vzťa­hoch dy­na­mi­ky.
Po­lo­hu kon­krét­ne­ho vr­cho­lu RB v da­nom ča­so­vom oka­mi­hu s(t) vy­po­čí­ta­me ro­tá­ciou (ro­ta­te) da­né­ho vr­cho­lu a je­ho po­su­nom (tran­sla­te) – pri­čí­ta­ním po­lo­hy ťa­žis­ka RB x(t):
s(t) = R(t) * s(0) + x(t)
Rých­losť kon­krét­ne­ho vr­cho­lu RB v da­nom ča­so­vom oka­mi­hu v(t) má dve zlož­ky – pria­mo­čia­ru v(t) a uh­lo­vú ω(t) x ( s(t) – x(t) )“, rých­losť v(t) sa rov­ná po­die­lu pria­mo­čia­rej hyb­nos­ti P(t) a cel­ko­vej hmot­nos­ti RB M:
v(t) = v(t) + ω(t) x ( s(t) – x(t) ), v(t) = P(t) / M
Uh­lo­vú rých­losť kon­krét­ne­ho vr­cho­lu RB v da­nom ča­so­vom oka­mi­hu ω(t) vy­po­čí­ta­me ska­lár­nym sú­či­nom tzv. in­ver­zné­ho ten­zo­ra zotr­vač­nos­ti (in­ver­se iner­tia ten­sor) a uh­lo­vej hyb­nos­ti:
ω(t) = I(t)-1 * L(t)
Krú­tia­ci mo­ment pô­so­bia­ci na kon­krét­ny vr­chol RB τ(t) vy­po­čí­ta­me vek­to­ro­vým sú­či­nom vek­to­ra s(t) – x(t) a vek­to­ra si­ly pô­so­bia­cej na da­ný vr­chol F(t):
τ(t) = ( s(t) – x(t) ) x F(t)

engine obr1.bmp

Obr. 1 Gra­fic­ké zná­zor­ne­nie pa­ra­met­rov sta­vo­vé­ho vek­to­ra

Na­bu­dú­ce...
V bu­dú­cej čas­ti se­riá­lu bu­de­me po­kra­čo­vať v opi­se teo­re­tic­kých zá­kla­dov si­mu­lá­cie fy­zi­ky v gra­fic­kých en­gi­noch. Vy­svet­lí­me vý­znam po­jmov ten­zor zotr­vač­nos­ti a im­pulz.

Ďal­šie čas­ti >>

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