Programujeme grafický engine XVI.

opengl_logo.jpg V tej­to čas­ti se­riá­lu po­drob­ne opí­še­me jed­not­li­vé kro­ky al­go­rit­mu vy­tvo­re­nia a vy­kres­le­nia stro­mu, kto­ré sme prak­tic­ky im­ple­men­to­va­li v ap­li­ká­cii Plants v1.0.

Po­drob­ný opis al­go­rit­mu vy­tvo­re­nia stro­mu
Ap­li­ká­cia Plants v1.0 ge­ne­ru­je strom po­mo­cou fun­kcie Ge­ne­ra­te(), kto­rá sa spúš­ťa z mo­du­lu Inter­fa­ce. Po­mo­cou re­kur­zie sa naj­skôr vy­tvo­rí kos­tra stro­mu a nás­led­ne sa prip­ra­via textú­ry pre 2D bi­llboar­dy. Ko­ná­re sú vy­kres­ľo­va­né v oka­mi­hu spus­te­nia fun­kcie Draw(). Jed­not­li­vé kro­ky mož­no roz­pí­sať tak­to:

1. Kos­tra stro­mu (ske­le­ton)
Kos­tru stro­mu vy­tvá­ra­me vo fun­kcii TreeRe­cur­se(). V tej­to re­kur­zív­nej fun­kcii doc­hád­za k tvor­be nav­zá­jom po­su­nu­tých a po­oto­če­ných čiar (Sli­ne). Kaž­dá čia­ra má svoj za­čia­tok, ko­niec, sta­no­ve­ný po­čet seg­men­tov a nie­koľ­ko ďal­ších pa­ra­met­rov. V prí­pa­de, že je to kon­co­vá čia­ra (vet­va stro­mu), dôj­de k vy­tvo­re­niu sku­pi­ny lis­tov (lea­ves), pre kto­ré sa špe­ci­fi­ku­je po­lo­ha a na­to­če­nie. Kaž­dá čia­ra kos­try stro­mu má troch „po­tom­kov“, kto­rých pa­ra­met­re sú nas­ta­vo­va­né v re­kur­zii. Re­kur­zia sa kon­čí po vy­tvo­re­ní po­ža­do­va­ných úrov­ní (DEPTH) kos­try stro­mu.

2. Ren­de­ring ko­ná­rov (branch)
Ko­ná­re stro­mu „oba­ľu­jú“ čia­ry kos­try stro­mu v pro­ce­se je­ho vy­kres­le­nia. Vo fun­kcii Ren­derTree() sa naj­skôr vy­kre­slia všet­ky ko­ná­re (Ren­derBranch()) a nás­led­ne všet­ky lis­ty. Pre vy­kres­le­nie ko­ná­rov pla­tí nas­le­du­jú­ce pra­vid­lo: Ko­nár má spo­loč­né vr­cho­ly pat­ria­ce je­ho spod­nej čas­ti (bot­tom) s vr­chol­mi, kto­ré pa­tria vrchnej čas­ti (top) pred­chád­za­jú­ce­ho ko­ná­ra. Uve­de­né pra­vid­lo pla­tí iba pre nav­zá­jom pre­po­je­né (nad­vä­zu­jú­ce) ko­ná­re. Do­siah­ne­me tak ply­nu­lé na­po­je­nie všet­kých čas­tí (ko­ná­rov) stro­mu.

3. Lis­ty stro­mu (lea­ves)
Lis­ty stro­mu vy­kres­le­né v rám­ci fun­kcie Ren­derTree() sú rep­re­zen­to­va­né jed­no­duc­hý­mi štvo­ru­hol­ník­mi, po­kry­tý­mi špe­ciál­ne navr­hnu­tou textú­rou. Ob­rá­zok, kto­rý pred­sta­vu­je textú­ru, sa ná­pad­ne po­do­bá na vet­vu stro­mu s lis­ta­mi. Nej­de te­da o sa­mos­tat­ný list, ale o vet­vu s via­ce­rý­mi lis­ta­mi. Po pri­po­je­ní tej­to vet­vy ku ko­ná­ru zís­ka­me po­mer­ne reál­ne vy­ze­ra­jú­ci strom, a to i v prí­pa­de, že po­uži­je­me ma­lý po­čet tro­ju­hol­ní­kov. Sa­moz­rej­me, že s po­čtom ob­jek­tov pred­sta­vu­jú­cich lis­ty stro­mu mož­no expe­ri­men­to­vať. V ur­či­tom mo­men­te tak mô­že­me zís­kať veľ­mi pek­ne vy­ze­ra­jú­ce stro­my, kto­ré bu­dú na ne­ro­zoz­na­nie od sku­toč­ných.

4. 2D ploc­hy (bi­llboards)
Po vy­ko­na­ní všet­kých uve­de­ných kro­kov nas­le­du­je vy­tvo­re­nie 2D bi­llboar­dov. Fun­kcia Ren­derSpri­te() je veľ­mi jed­no­duc­há, ale po­mer­ne účin­ná. Vy­uži­je­me fun­kciu kniž­ni­ce OpenGL, kto­rá po vy­kres­le­ní stro­mu sko­pí­ru­je ob­sah ob­ra­zov­ky do prip­ra­ve­né­ho ob­jek­tu textú­ry. Ta­kým­to spô­so­bom zís­ka­me textú­ru, kto­rou nes­kôr po­kry­je­me 2D bi­llboard. 3D strom tak nah­ra­dí­me 2D stro­mom, kto­ré­ho vy­kres­le­nie je ove­ľa rých­lej­šie a efek­tív­nej­šie.

Vy­kres­le­nie stro­mu
Vy­kres­le­nie stro­mu vy­ko­ná­va fun­kcia Draw(). Na zá­kla­de po­rov­na­nia vzdia­le­nos­ti po­zo­ro­va­te­ľa od stro­mu s de­fi­no­va­ný­mi hod­no­ta­mi pre LOD dôj­de k vy­kres­le­niu 3D stro­mu, vy­kres­le­niu 2D bi­llboar­du, resp. k vy­kres­le­niu stá­le me­nej a me­nej vi­di­teľ­né­ho 2D bi­llboar­du až po hra­ni­cu vi­di­teľ­nos­ti, od kto­rej strom ne­bu­de vy­kres­le­ný (fa­de-out efekt).

V tom­to mo­men­te vie­me, ako bol strom vy­ge­ne­ro­va­ný a vy­kres­le­ný. Zdro­jo­vý kód ap­li­ká­cie ob­sa­hu­je množ­stvo ko­men­tá­rov, tak­že je­ho po­cho­pe­nie by ne­ma­lo byť prob­le­ma­tic­ké. Kód ďa­lej ob­sa­hu­je od­ka­zy na mož­né úp­ra­vy, kto­rý­mi sa da­jú do­siah­nuť vý­raz­né zme­ny v spô­so­be a ta­kis­to kva­li­te vy­kres­le­nia stro­mu (za­zna­če­né ako // DO­RO­BIT: ...). Zá­le­ží len na nás, akým spô­so­bom mie­ni­me tie­to blo­ky kó­du up­ra­viť. Nes­mie­me však za­bud­núť na jed­no dô­le­ži­té ob­med­ze­nie: Ma­sív­nym zvý­še­ním po­čtu vy­kres­le­ných tro­ju­hol­ní­kov dôj­de k pria­moú­mer­né­mu zní­že­niu vý­ko­nu ap­li­ká­cie.

engine1.jpg
Obr. 1 Prík­la­dy stro­mov vy­tvo­re­ných v ap­li­ká­cii Plants v1.0

Na­bu­dú­ce...
Na­bu­dú­ce bu­de­me po­kra­čo­vať vo vý­vo­ji ap­li­ká­cie Plants. Pred­sta­ví­me vám ver­ziu 2.0, kto­rá ok­rem ren­de­rin­gu stro­mov umož­ní ren­de­ro­vať krí­ky a trá­vu.

Ďal­šie čas­ti >>

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