Programujeme grafický engine XII.

opengl_logo.jpg V tej­to čas­ti se­riá­lu sa bu­de­me ve­no­vať opi­su al­go­rit­mu vý­poč­tu fa­rieb jed­not­li­vých bo­dov sve­tel­ných máp.

Lu­mel
Na za­čia­tok si pri­po­meň­me, že bo­dy, z kto­rých sú zlo­že­né bež­né dvoj­roz­mer­né textú­ry, na­zý­va­me tzv. textú­ro­va­cí­mi ele­men­tmi (texels – textu­re ele­ments). Pri týc­hto bo­doch zväč­ša ne­pot­re­bu­je­me po­znať ni­ja­ký ich špe­ciál­ny pa­ra­me­ter, úpl­ne po­sta­ču­je in­for­má­cia o ich far­be. Nao­pak, tzv. lu­mel­mi (lu­mels – lig­htmap ele­ments) na­zý­va­me bo­dy, z kto­rých sú zlo­že­né sve­tel­né ma­py. Ich naj­dô­le­ži­tej­ším pa­ra­met­rom je ta­kis­to ich far­ba, ale na to, aby sme ju ve­de­li ur­čiť, po­tre­bu­je­me po­znať ďal­ší dô­le­ži­tý pa­ra­me­ter lu­me­lov, a to ich po­lo­hu. Po­lo­hou pri­tom ne­ro­zu­mie­me 2D po­lo­hu v rám­ci sve­tel­nej ma­py, ale 3D po­lo­hu v rám­ci scé­ny (world po­si­tion).

Vý­po­čet fa­rieb lu­me­lov
Al­go­rit­mus vý­poč­tu fa­rieb lu­me­lov je zlo­že­ný z dvoch hlav­ných kro­kov:
1. vý­po­čet 3D sú­rad­níc lu­me­lov,
2. ur­če­nie far­by lu­me­lov.

:: Vý­po­čet 3D sú­rad­níc lu­me­lov
Vý­po­čet 3D sú­rad­níc lu­me­lov je po­mer­ne zlo­ži­tý. V jed­no­duc­hos­ti mož­no skon­šta­to­vať, že po­tre­bu­je­me vy­po­čí­tať 3D sú­rad­ni­ce vr­cho­lu, kto­rý bu­de ko­pí­ro­vať ploc­hu tvo­re­nú tro­ju­hol­ní­kom, pre kto­rý prip­ra­vu­je­me sve­tel­nú ma­pu. Po­kiaľ by bol tro­ju­hol­ník rov­no­bež­ný, prí­pad­ne kol­mý na niek­to­rú zo zob­ra­zo­va­cích ro­vín, prob­lém by sme moh­li zjed­no­du­šiť na vý­po­čet 2D sú­rad­níc s jed­no­duc­hým dopl­ne­ním tre­tej sú­rad­ni­ce. No vý­po­čet 3D sú­rad­níc lu­me­lov pre tro­ju­hol­ní­ky, kto­ré sú v scé­ne ľu­bo­voľ­ne po­su­nu­té a na­to­če­né, je zlo­ži­tej­ší. Uve­de­ný vý­po­čet mož­no reali­zo­vať via­ce­rý­mi spô­sob­mi. Náš vý­po­čet je za­lo­že­ný na pri­da­ní ďal­šie­ho tro­ju­hol­ní­ka, kto­rý je to­tož­ný s ori­gi­nál­nym, ale „za­rov­na­ný“ do pra­vouh­lej sú­rad­ni­co­vej sús­ta­vy. Na obr. 1 mož­no vi­dieť oba tro­ju­hol­ní­ky s opi­som po­uži­tých pre­men­ných.

engine OBR1.bmp
Obr. 1 Tro­ju­hol­ní­ky s pre­men­ný­mi po­uži­tý­mi na vý­po­čet 3D sú­rad­níc lu­me­lov

Zá­kla­dom na od­vo­de­nie vzťa­hov po­uži­teľ­ných v praxi je plat­nosť nas­le­du­jú­ce­ho tvr­de­nia:

( X1 – X2 ) / ( Y1 – Y2 ) = ( X4 – X2 ) / ( Y4 – Y2 )
( T1 – T2 ) / ( Y1 – Y2 ) = ( T4 – T2 ) / ( Y4 – Y2 )

Nás­led­né od­vo­de­nie kon­krét­nych vzťa­hov, kto­ré po­uži­je­me na prak­tic­ký vý­po­čet 3D sú­rad­níc lu­me­lov, je čis­to zá­le­ži­tosť správ­nej ma­te­ma­tic­kej de­ri­vá­cie a vzá­jom­né­ho nah­ra­de­nia jed­not­li­vých vý­ra­zov. Po tej­to de­ri­vá­cii zís­ka­me všet­ky po­treb­né vzťa­hy:

de­no­mi­na­tor=(v0-v2)(u1-u2)-(v1-v2)(u0-u2)

dpdu=((x1-x2)(v0-v2)-(x0-x2)(v1-v2))/de­no­mi­na­tor
dpdv=((x1-x2)(u0-u2)-(x0-x2)(u1-u2))/-de­no­mi­na­tor
dqdu=((y1-y2)(v0-v2)-(y0-y2)(v1-v2))/de­no­mi­na­tor
dqdv=((y1-y2)(u0-u2)-(y0-y2)(u1-u2))/-de­no­mi­na­tor

po­s0=v0.0+(dpdu*LP->x)+(dpdv*LP->y)
po­s1=v0.1+(dqdu*LP->x)+(dqdv*LP->y)

Všim­ni­me si po­sled­né dva vzťa­hy. Sú po­uži­té na vý­sled­ný vý­po­čet dvoch sú­rad­níc lu­me­lov. Pre­čo ne­ho­vo­rí­me o kon­krét­nych sú­rad­ni­ciach, ako sú napr. X či Y, ale po­uží­va­me po­me­no­va­nie 0 a 1 (po­s0, po­s1, v0.0, v0.1)? Dô­vo­dom je na­to­če­nie tro­ju­hol­ní­ka a od to­ho zá­vis­lý vý­po­čet tre­tej sú­rad­ni­ce. Vy­chád­za sa to­tiž z fak­tu, že sú­rad­ni­ce X, Y a Z lu­me­lov zís­ka­me po tzv. pro­jek­cii tro­ju­hol­ní­ka do jed­nej zo zob­ra­zo­va­cích ro­vín. Uro­bí­me tak na zá­kla­de de­ter­mi­ná­cie, kto­rá z troch sú­rad­níc nor­má­ly tro­ju­hol­ní­ka je naj­väč­šia. V prí­pa­de, ak ňou je napr. sú­rad­ni­ca Y, vie­me po­ve­dať, že tro­ju­hol­ník „pro­jek­tu­je­me“ do ro­vi­ny XZ a uve­de­ný­mi vzťah­mi vy­po­čí­ta­me sú­rad­ni­ce X a Z lu­me­lov. Dopl­ne­nie tre­tej sú­rad­ni­ce, v tom­to prí­pa­de sú­rad­ni­ce Y, reali­zu­je­me dopl­ne­ním po­treb­ných úda­jov do rov­ni­ce ro­vi­ny, kto­rú tvo­rí da­ný tro­ju­hol­ník.

Na­bu­dú­ce...
V po­sled­nej čas­ti blo­ku ve­no­va­né­ho sve­tel­ným ma­pám pred­ve­die­me, ako im­ple­men­to­vať uve­de­ný al­go­rit­mus do prak­tic­kej ap­li­ká­cie.

Ďal­šie čas­ti >>

Zdroj: Infoware 12/2008



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