Programujeme grafický engine XVIII.

Tým­to člán­kom ukon­čí­me té­mu ve­no­va­nú zob­ra­zo­va­niu 3D stro­mov a trá­vy. Opí­še­me no­vý mo­dul ap­li­ká­cie Plants v2.0, kto­rý slú­ži na vy­tvo­re­nie a zob­ra­ze­nie trá­vy.

engine1.jpg

Obr. 1 Gra­fic­ký vý­stup ap­li­ká­cie Plants v2.0

Mo­dul PlantGrass
Ap­li­ká­cia Plants v2.0 ob­sa­hu­je rov­na­ké sú­bo­ry ako pô­vod­ná ap­li­ká­cia Plants v1.0. Drob­né zme­ny sme uro­bi­li v mo­du­le Inter­fa­ce, kto­rý sme dopl­ni­li o dek­la­rá­ciu pre­men­nej my_Grass. Tá­to pre­men­ná je in­štan­ciou trie­dy PlantGrass, kto­rá ob­sa­hu­je všet­ky pre­men­né a fun­kcie po­treb­né na vy­tvo­re­nie a zob­ra­ze­nie trá­vy. Pô­vod­ný zoz­nam sú­bo­rov sme roz­ší­ri­li o sú­bo­ry mPlantGrass.cpp a mPlantGrass.h, kto­rých ob­sah po­drob­ne opí­še­me.

mPlantGrass.h
Sú­bor ob­sa­hu­je de­fi­ní­ciu štruk­túr po­treb­ných na prá­cu s trá­vou a dek­la­rá­ciu trie­dy PlantGrass, kto­rá in­teg­ru­je prip­ra­ve­né štruk­tú­ry. Jed­not­li­vé de­fi­ní­cie by sme moh­li zjed­no­du­šiť, ale ich všeo­bec­nej­ší va­riant bu­de­me môcť nes­kôr s vý­ho­dou po­užiť pri príp­ra­ve kom­plexnej­šie­ho kó­du.

Vzťah de­fi­no­va­ných štruk­túr k al­go­rit­mu, kto­rý sme uvied­li v pre­doš­lej čas­ti se­riá­lu, je nas­le­du­jú­ci:
 hra­nič­ný štvo­ru­hol­ník (zlo­že­ný z dvoch tro­ju­hol­ní­kov) je de­fi­no­va­ný štyr­mi vr­chol­mi – grassquad,
 kaž­dá vzor­ka trá­vy má de­fi­no­va­nú po­lo­hu a far­bu – gras­ssamp­le,
 do scé­ny mô­že byť umies­tne­ných nie­koľ­ko hra­nič­ných štvo­ru­hol­ní­kov ob­sa­hu­jú­cich trá­vu – gras­sarray.

Trie­da PlantGrass ďa­lej ob­sa­hu­je dve dô­le­ži­té fun­kcie: Set­Gras­sSam­ples() – fun­kcia na vý­po­čet po­lôh vzo­riek trá­vy, Ren­derGras­sSam­ples() – fun­kcia, v rám­ci kto­rej sa vy­kre­slia všet­ky vzor­ky trá­vy.

mPlantGrass.cpp
Pri konštruk­cii in­štan­cie trie­dy PlantGrass dôj­de k auto­ma­tic­ké­mu vý­poč­tu po­lôh vzo­riek trá­vy. Po­lo­hy vzo­riek sa vy­po­čí­ta­jú na zá­kla­de al­go­rit­mu vy­pl­ne­nia tro­ju­hol­ní­ka (vo veľ­kej mie­re sa po­uží­va­jú vek­to­ro­vé vý­poč­ty a teória tý­ka­jú­ca sa geo­me­trie 3D tro­ju­hol­ní­ka). Pri vy­pĺňa­ní tro­ju­hol­ní­ka sa v kaž­dom kro­ku vy­po­čí­ta­jú bo­dy pat­ria­ce je­ho ľa­vej a pra­vej hra­ni­ci (stra­ne tro­ju­hol­ní­ka). Na spoj­ni­cu týc­hto bo­dov sa nás­led­ne v pra­vi­del­ných inter­va­loch umies­tnia bo­dy, kto­ré bu­dú rep­re­zen­to­vať po­lo­hu kon­krét­nych vzo­riek trá­vy.

Vy­kres­le­nie všet­kých vzo­riek trá­vy sa us­ku­toč­ní v rám­ci fun­kcie Draw(), kto­rá bez­pros­tred­ne vy­ko­ná fun­kciu Ren­derGras­sSam­ples().

engine2.jpg
Obr. 2 Ap­li­ko­va­nie via­ce­rých urý­chľo­va­cích tec­hník

Pri vy­kres­ľo­va­ní vzo­riek trá­vy sú im­ple­men­to­va­né ďal­šie čas­ti všeo­bec­né­ho al­go­rit­mu:
 vzor­ky nac­hád­za­jú­ce sa za hra­ni­cou vy­kres­le­nia (h1) sa ne­vyk­re­slia,
 vzdia­le­né vzor­ky sú oto­če­né kol­mo na smer po­hľa­du po­zo­ro­va­te­ľa (tzv. bi­llboard),
 po­čet vy­kres­le­ných vzo­riek je pria­moú­mer­ne zá­vis­lý od vzdia­le­nos­ti od po­zo­ro­va­te­ľa – na sta­no­ve­nie uve­de­né­ho po­čtu je po­uži­tá jed­no­duc­há me­tó­da LOD, vzor­ky nac­hád­za­jú­ce sa bliž­šie sa ná­hod­ne otá­ča­jú a po­sú­va­jú tak, aby sa do­siah­la po­ža­do­va­ná hus­to­ta trá­vy,
 vzor­ky, kto­ré sú v bez­pros­tred­nej blíz­kos­ti po­zo­ro­va­te­ľa (h0), sú zá­ro­veň ani­mo­va­né,
 na do­siah­nu­tie reál­nej­šie­ho doj­mu sú jed­not­li­vé vzor­ky po­kry­té ná­hod­ne po­su­nu­tý­mi textú­ra­mi.

Prá­ve kom­bi­ná­ciou všet­kých opí­sa­ných po­stu­pov do­ká­že­me zís­kať po­mer­ne reál­ne vý­sled­ky.

engine3.jpg
Obr. 3 Trá­va má po­ža­do­va­nú hus­to­tu

Na­bu­dú­ce...
V bu­dú­cej čas­ti se­riá­lu sa za­čne­me ve­no­vať zob­ra­zo­va­niu vnú­tor­ných (in­door) pries­to­rov. Uve­die­me zá­klad­né in­for­má­cie sú­vi­sia­ce s ren­de­rin­gom uzav­re­tých pries­to­rov, pri­čom jed­not­li­vé po­stu­py bu­de­me prak­tic­ky de­monštro­vať na vzo­ro­vej ap­li­ká­cii.

Ďal­šie čas­ti >>

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