Programujeme grafický engine XIII.

opengl_logo.jpg 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ť al­go­rit­mus vý­poč­tu fa­rieb bo­dov (lu­me­lov) sve­tel­ných máp do prak­tic­kej ap­li­ká­cie.

Fun­kcie ap­li­ká­cie
Fun­kcie ap­li­ká­cie Lig­htmap, v kto­rých je im­ple­men­to­va­ný al­go­rit­mus vý­poč­tu sve­tel­ných máp, sú umies­tne­né do sú­bo­ru mFron­tend.cpp (mFron­tend.h):

tri_lig­htmaps();
lm_worldpos();

a sú­bo­ru m3d­math.cpp (m3d­math.h):

RayT­ri­Colli­sion();

V pr­vej z uve­de­ných fun­kcií sa pra­cu­je s kaž­dým tro­ju­hol­ní­kom umies­tne­ným do scé­ny. Sve­tel­ná ma­pa sa tak vy­tvá­ra pre kaž­dý tro­ju­hol­ník, a to na zá­kla­de tes­tu ko­lí­zie do­pa­da­jú­ce­ho sve­tel­né­ho lú­ča so všet­ký­mi os­tat­ný­mi tro­ju­hol­ník­mi. Na za­čiat­ku je kaž­dé­mu lu­me­lu nas­ta­ve­ná neut­rál­na far­ba. Po jed­no­duc­hom vý­poč­te 2D sú­rad­níc lu­me­lu je vo­la­ná dru­há z uve­de­ných fun­kcií, v kto­rej dôj­de k vý­poč­tu 3D sú­rad­níc lu­me­lu. Vý­po­čet pri­tom strik­tne dodr­žia­va pra­vid­lá al­go­rit­mu opí­sa­né­ho v pred­chád­za­jú­cej čas­ti se­riá­lu. Po ur­če­ní, do kto­rej zob­ra­zo­va­cej ro­vi­ny bu­de tro­ju­hol­ník „pro­jek­to­va­ný“, sa po­stup­ne reali­zu­je vý­po­čet koe­fi­cien­tov dpdu, dpdv, dqdu, dqdv a nás­led­ne vý­po­čet 3D sú­rad­níc. Kaž­dý jed­not­li­vý blok kó­du som sa sna­žil čo naj­pod­rob­nej­šie oko­men­to­vať pria­mo v sú­bo­roch so zdro­jo­vým kó­dom, tak­že na tom­to mies­te sa ku ko­men­tá­ru ne­bu­dem vra­cať. Bu­de­me sa ve­no­vať opi­su ďal­ších kro­kov v pro­ce­se ur­če­nia far­by lu­me­lov.

engine1.jpg
Obr. 1 Scé­na s vy­ge­ne­ro­va­ným tie­ňom

Ko­lí­zia lú­ča s ob­jek­tmi scé­ny
Vý­poč­tom 3D sú­rad­níc lu­me­lov sa al­go­rit­mus vý­poč­tu ich fa­rieb ne­kon­čí. V tom­to mo­men­te sí­ce vie­me po­ve­dať, aká je po­lo­ha kon­krét­ne­ho lu­me­lu, stá­le však ne­poz­ná­me je­ho far­bu. Far­ba kaž­dé­ho lu­me­lu je sta­no­ve­ná na zá­kla­de tes­tu, pri kto­rom sve­tel­ný lúč vy­sla­ný zo sve­tel­né­ho zdro­ja prec­hád­za scé­nou a do­pa­dá do po­lo­hy lu­me­lu. V prí­pa­de, že ten­to lúč ne­ko­li­du­je so žiad­nym ob­jek­tom (tro­ju­hol­ní­kom umies­tne­ným v scé­ne), je da­né­mu lu­me­lu pri­ra­de­ná bi­ela far­ba – lu­mel je os­vet­le­ný. Nao­pak, v prí­pa­de, že sve­tel­ný lúč ko­li­du­je s ob­jek­tom scé­ny, kto­rý sa nac­hád­za med­zi po­lo­hou sve­tel­né­ho zdro­ja a po­lo­hou lu­me­lu, to­mu­to lu­me­lu je pri­ra­de­ná čier­na far­ba – lu­mel je v tie­ni.

Všet­ka čin­nosť opí­sa­ná v pre­doš­lom od­se­ku sa vy­ko­ná­va v pred­pos­led­nej čas­ti fun­kcie tri_lig­htmaps(); pri­čom de­tek­cia ko­lí­zie sve­tel­né­ho lú­ča s ob­jek­tmi scé­ny sa vy­ko­ná­va vo fun­kcii RayT­ri­Colli­sion();. De­tek­cia ko­lí­zie je za­lo­že­ná na vý­poč­te prie­seč­ní­ka sve­tel­né­ho lú­ča s ro­vi­nou, kto­rú tvo­rí kon­krét­ny tro­ju­hol­ník, a nás­led­nom ur­če­ní, či ten­to prie­seč­ník le­ží, resp. ne­le­ží v da­nom tro­ju­hol­ní­ku.

Roz­ma­za­nie ok­ra­jov tie­ňa
V po­sled­nej čas­ti fun­kcie tri_lig­htmaps(); je po­uži­tý veľ­mi jed­no­duc­hý spô­sob roz­ma­za­nia ok­ra­jov tie­ňa, pri kto­rom dôj­de k vý­poč­tu prie­me­ru fa­rieb su­sed­ných lu­me­lov tak, aby sa do vý­sled­nej sve­tel­nej ma­py neu­lo­žil tieň s hra­na­tý­mi ok­raj­mi (po­čí­ta­čom ge­ne­ro­va­ný tieň), ale aby ok­ra­je toh­to tie­ňa čo naj­ver­nej­šie pri­po­mí­na­li ok­ra­je tie­ňov v reál­nom sve­te. Vy­po­čí­ta­né far­by lu­me­lov sa nás­led­ne po­uži­jú na vy­tvo­re­nie ob­jek­tu textú­ry, kto­rá sa nes­kôr vy­uži­je na po­kry­tie ob­jek­tov scé­ny v kom­bi­ná­cii s ich pô­vod­nou (ori­gi­nál­nou) textú­rou.

engine2.jpg
Obr. 2 Scé­na s vy­ge­ne­ro­va­ným tie­ňom

Na­bu­dú­ce...
V nas­le­du­jú­cej čas­ti se­riá­lu sa za­me­ria­me na tvor­bu ras­tlín (plants). Sí­ce by sme sa moh­li vrá­tiť k ap­li­ká­cii En­gi­ne, do kto­rej by sme moh­li už te­raz vlo­žiť nie­koľ­ko ob­jek­tov a vy­skú­šať si prak­tic­kú fun­kčnosť tie­ňov, ale stá­le je to má­lo na to, aby na­ša scé­na vy­ze­ra­la dos­ta­toč­ne vie­ro­hod­ne. Pre­to si naj­skôr uká­že­me, ako mož­no po­mo­cou po­čí­ta­čo­vej gra­fi­ky vy­tvo­riť roz­lič­né dru­hy ras­tlín, po­čnúc ge­ne­ro­va­ním ume­lej trá­vy a kon­čiac tvor­bou troj­roz­mer­ných stro­mov.

Ďal­šie čas­ti >>

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