Metódy 3D grafiky (2. časť, terén)
... pokračovanie z minulej lekcie
V tejto lekcii sa budeme zaoberať tvorbou vonkajších ("outdoor") terénov. Metódy tvorby terénu si ukážeme na programe Metódy 3D, ktorý si môžete stiahnuť na konci lekcie.
1. Štvorec
Úplne najjednoduchším typom teréne je prostá štvorcová alebo obdĺžniková plocha založená na prvku stena (ktorý tvoria 2 pravouhlé trojuholníky). Prvok je roztiahnutý na rozmery teréne a pokrytý jednou veľkou textúrou.
Štvorcový terén má výhodu v jednoduchosti, avšak za cenu mnohých nevýhod. Okrem toho, že terén nemôžeme výškovo členiť, je najväčšou nevýhodou potrebné veľké textúry. Vzhľadom k tomu, že si nemôžeme dovoliť rozmer textúry príliš zvyšovať (napr. Kvôli obmedzeniu grafickej karty), je textúra takého povrchu značne rozmazaná.
Istou náplasťou je použitie multitextur. Moduluje Ak je povrch, opatrený rozmernú textúrou, ďalšie textúrou, ale s vyššou frekvenciou opakovaní, vytvoríme tým na povrchu jemne zrnitý povrch.
Efekt vytvorí v pozorovateľovi dojem, že povrch má oveľa jemnejšie členitosť než v skutočnosti má. Rozdiel môžeme porovnať na nasledujúcich dvoch snímkach. Prvá snímka je štvorcový terén bez multitextur, druhý s multitexturou. Prepnutie je možné klávesom M.
Medzi ďalšie nevýhody štvorcového teréne je problematické zobrazenie veľkých renderovaných plôch. Problém vznikne napríklad pri pokuse osvetliť strednú časť štvorcového terénu. Pri výpočte osvetlení renderovací jednotka najskôr vypočíta osvetlenie vo vrcholoch objektu. Potom vykresľuje vnútornej časti plôch, ich osvetlenie počíta interpoláciou z vrcholov. Preto zostane stredná časť plochy tmavá, hoci do nej umiestnime lokálny zdroj svetla. Naopak, ak budeme týmto zdrojom pohybovať po okruhu okolo teréne, budeme pozorovať, že jednej chvíli je terén tmavý a vzápätí svetlý, v závislosti na tom, ako je zdroj svetla blízko k niektorému z vrcholov terénu.
Problém s renderovaním veľké plochy sa môže prejaviť aj pri renderovaní hmly, zapneme ak mód vrcholovej hmly. V tom prípade sa hmla počíta vo vrcholoch plochy a potom sa interpolujú, podobne ako pri výpočte osvetlenia. Tým vznikne efekt "podivného" správanie hmly, kedy je hmla jednej chvíli úplne nepriehľadná (aj v najbližších miestach teréne) a inokedy sa zas vôbec neprejaví. Našťastie tento problém nie je častým prípadom, pretože je bežne podporovaná tabuľková hmla, ktorá počíta hmlu pre každý opísaná bod samostatne.
Len pre zaujímavosť si uveďme ešte jeden možný typ problému vykresľovanie veľké plochy. Pri renderovanie jednotlivých trojuholníkov objektov postupuje renderovací jednotka tak, že najskôr vypočíta mapovanie textúry vo vrcholoch plôšok a potom vykresľuje vnútornej časti plôšok tak, že súradnicu v textúre interpolujú z vrcholových súradníc. Ak by sme použili jednoducho interpolovanou textúru pri perspektívnym zobrazenie, vykreslil by sa napríklad stred plôšky logicky uprostred trojuholníka, čo ale nezodpovedá perspektívny projekciu, kde Súradnicovo stredná časť má byť opticky oveľa ďalej od nás, teda bližšie ku vzdialenejšiemu koncu plôšky než k bližšiemu. Pri pohybe v takomto teréne by povrch terénu pred nami neustále akoby plával a prelieval sa. Našťastie sa tento problém dnes už prakticky nevyskytuje, pretože všetky nové grafické karty už podporujú perspektívne korekciu zobrazenie textúr, závislú na zvolenom type projekcie.
Ako je z uvedených výhod a nevýhod zrejmé, bude štvorcový terén vhodný skôr len pre malé plochy, napríklad pre podlahu v miestnosti či terén malého priestranstva.
2. Štvorec s opakovaním
Istého zlepšenie štvorcového terénu dosiahneme, pokiaľ naň namiesto jednej veľkej textúry namapujete malú textúru, ale s opakovaním. Môže to byť napríklad textúra trávy alebo textúra dlaždice. V ukážkovom programe sa obe textúry striedavo prepínajú pri výbere tohto typu terénu.
Opakovaním textúry dosiahneme to, že textúra má oveľa vyššiu jemnosť a vyzerá už prirodzenejšie. Samozrejme za cenu toho, že textúra na celom teréne musí byť rovnaká. Ale výsledok je už celkom použiteľný pre mnoho jednoduchších aplikácií.
3. Plocha
V systéme Petr máme pre tvorbu terénu k dispozícii prvok terén z plochy. Prvku odovzdáme ako parameter plochu, na ktorej pomocou predmetov vykreslíme vzhľad jednotlivých častí terénu a pomocou číselnej hodnoty 1 nadefinujeme výšku v každej časti teréne.
Prvok vytvorí objekt teréne ako štvorcovú sieť plôšok, ktorej vrcholy odpovedajú zadaným výškam. Obrazy použitých políčok zostaví do jednej textúry tak, aby susedné políčka na seba nadväzovala. Výslednú textúru namapuje na terén.
Táto metóda umožňuje ľahko vytvárať terén s presne špecifikovaným vzhľadom povrchu. Ďalšou veľkou prednosťou je možnosť používať vstavanú funkciu pre zistenie výšky v teréne, ktorá pre vygenerovaný terén dokáže zistiť výšku terénu v akomkoľvek mieste teréne. Tak možno ľahko implementovať pohyb hráčov po teréne alebo rozmiestnenie objektov po povrchu terénu.
Najväčšou nevýhodou terénu generovaného z plochy je použitie políčok ako textúry, teda obrázky s rozmermi 32 x 32 bodov. Textúra takéhoto povrchu je neostrá a to obzvlášť ak použijeme veľký počet typov políčok vyžadujúce veľkú výslednú textúru. Upozorňujem, že nie je rozhodujúci počet políčok na ploche ale počet typov políčok, textúry rovnakých políčok sa zdieľa.
4. Výšková mapa
Ďalším prvkom Petra, slúžiacim na generovanie terénov, je prvok terén z obrázku. Vstupom prvku je tentoraz obrázok, použitý ako výšková mapa.
Prvok opäť vygeneruje terén ako štvorcovú sieť plôšok, ale výšky jednotlivých vrcholov zistí z výškovej mapy. Čím je príslušný grafický bod obrázku svetlejšie, tým bude výsledný vrchol terénu vyššie. Pri generovaní terénu sa uplatní prvok pre vyhladenie textúr, ktorý zabezpečí, že povrch terénu bude vyhladený. Na celom povrchu terénu bude namapovaná jedna textúra opakovane - použili sme opäť textúru trávy ako u terénu štvorca s opakovaním. Podobne ako u predchádzajúceho typu terénu, aj u teréne generovaného z výškovej mapy môžeme využiť funkciu pre zistenie výšky v teréne.
5. Projekcia textúry
Kombinujeme Ak pri objekte viac textúr ako multitextury, sme obmedzení schopnosťami grafickej karty. Mnoho dnešných grafický kariet už umožňuje používať mnohastupňové multitextury, ale v mnohých prípadoch sme obmedzení iba na 2 textúry alebo niektoré slabšie karty nepodporujú multitextury vôbec.
Preto máme v Petrovi k dispozícii funkciu pre mapovanie textúry, ktorá umožňuje pre niektoré účely multitexturu simulovať tým, že vykoná projekciu textúry do farieb vrcholov objektu. Tak môžeme raz textúrou sfarbiť vrcholy objektu a druhú textúrou pokryť povrch objektu. To možno s výhodou využiť napríklad u terénu.
Použijeme opäť predošlý terén, generovaný z výškovej mapy. Na celý terén vykonáme projekciu s nastavenou zafarbenou textúrou podľa následujícícho obrázku, čím dôjde k zafarbeniu vrcholov terénu.
Pôvodný textúru trávy nahradíme inou textúrou, bude to opäť rovnaká textúra trávy, ale odfarbená na čiernobielu farbu.
Textúra trávy sa zafarbia farbou vrcholov teréne a ako vidíte na nasledujúcom obrázku, výsledok je skutočne pôsobivý. Môžeme tak ľahko vytvárať terény, ktoré vyzerajú pomerne realisticky. Navyše ešte stále u tohto terénu môžeme používať funkciu pre zistenie výšky terénu.
Okrem zafarbenie terénu môžeme projekciu textúry použiť ešte pre tieňovú mapu, čo je definícia osvetlenie terénu. Takto môžeme vytvoriť osvetlenie teréne nezávisle na hlavnom osvetlenie (v skutočnosti môžeme osvetlenie dokonca vypnúť) a tiež môžeme nasimulovať tiene od veľkých statických objektov, ako napr. Tiene od budov. Tieňovú mapu môžeme pripraviť buď ručným kreslením alebo vyrenderováním v 3D editore.
6. Dlaždice
Predchádzajúce metódy majú nevýhodu v tom, že buď sa na povrchu opakuje jedna textúra alebo má textúra nízke rozlíšenie. Ak chceme dosiahnuť kvalitného vzhľadu textúr, musíme terén zostaviť z viacerých častí a každej časti priradiť samostatnú textúru.
Najjednoduchším prípadom sú dlaždice. Použijeme opäť plochu s definíciou terénu. Budeme programovo prechádzať jednotlivé políčka plochy a na každej pozícii vytvoríme jednu dlaždicu ako štvorcovú stenu (položenú vodorovne). Dlaždicu priradíme textúru s vyšším rozlíšením podľa políčka na pozíciu.
U textúr by sme mali riešiť ich vzájomné nadväzovanie. To zaistíme predovšetkým tým, že ich budeme pripravovať z bezšvíkových textúr, ktorých začiatky a konce na seba nadväzujú. Ďalej musíme u každej textúry zabezpečiť správne adresovanie. Pokiaľ na seba nadväzuje okraj s protiľahlom okrajom, zapneme adresovanie s opakovaním. Pri odlišných okrajoch musíme použiť adresovania s orezaním textúry. Ak sa chceme zbaviť ostrého prechodu medzi textúrami v móde opakovaní, môžeme to zabezpečiť tým, že spojovacie rad Texel bude pre obe nadväzujúce textúry presne rovnaká.
7. Segmenty
Dlaždicový terén umožňuje už dosiahnuť kvalitných textúr, je to však stále ešte jedna rovina. Ak chceme zabezpečiť aj rôznu výšku častí terénu, musíme namiesto jednoduchých dlaždíc použiť generované 3D objekty, segmenty. K programovému generovanie 3D objektov môžeme použiť prvok objekt z textu (u plnej verzie Petra tiež prvok vytvorenie 3D objektu z pamäťových blokov).
Pri generovaní modelu jedného segmentu musíme vyjsť z defince formátu DirectX súboru x v Textor tvare. Generujeme súradnice vrcholov (relatívne k stredu segmentu), normály vo vrcholoch, indexy plôšok a mapovanie súradníc textúr. Tu je príklad jedného vygenerovaného segmentu:
xof 0303txt 0032 Mesh { 4; -10;16.40225;-10;, -10;2.60224999999998;10;, 10;-15.50675;10;, 10;-3.49774999999998;-10;; 2; 3;0,1,2;, 3;0,2,3;; MeshNormals { 4; 0.338181010771736;0.939391696588159;0.0563635017952893;, 0.175885430692562;0.836653255761983;0.518725018572429;, 0.368685553271484;0.814369768118581;0.448188401884061;, 0.370316746357589;0.744355269060483;0.555698426117102;; 2; 3;0,1,2;, 3;0,2,3;; } MeshTextureCoords { 4; 0;1;, 0;0;, 1;0;, 1;1;; } } |
Odvodíme si vzťahy pre výpočet normály v jednom vrchole teréne. Uvažujme, že šírka jedného segmentu teréne je w a výška (resp. Hĺbka) je h. Z plochy si načítame výšky vrcholov Y0 (stred), Y1 (vľavo), Y2 (vpravo), Y3 (hore) a Y4 (dole). Vrcholy teda budú mať súradnice:
- V0 = [0, Y0, 0]
- V1 = [-w, Y1, 0]
- V2 = [w, Y2, 0]
- V3 = [0, Y3, h]
- V4 = [0, Y4, -h]
Z rozdielov súradníc vrcholov vypočítame smerové vektory hrán segmente vychádzajúcich zo stredového vrcholu:
- v1 = V1 - V0 = [-w, Y1 - Y0, 0]
- v2 = V2 - V0 = [w, Y2 - Y0, 0]
- v3 = V3 - V0 = [0, Y3 - Y0, h]
- v4 = V4 - V0 = [0, Y4 - Y0, -h]
Vynásobíme ak smerové vektory hrán segmentov pomocou vektorového súčinu, obdržíme vektory normál susedných segmentov. Vektorový súčin c = a x b počítame ako: cx = ay * bz - az * by; cy = az * bx - ax * bz; sk = ax * by - ay * bx (slovne: násobok zvyšných zložiek v priamom smere mínus násobok v opačnom smere). Jeden z vektorov pritom otáčame, takže:
- N14 = -
v1 ** ** x **
** v4 = [h (Y1 - Y0), w h, w (Y4 - Y0)] **
- N42 = -
v4 ** ** x **
** v2 = [- h (Y2 - Y0), w h, w **** (Y4 - Y0)]
- n23 = -
v2 ** ** x **
** v3 = [- h (Y2 - Y0), w h, - w (Y3 - Y0)] **
- N31 = -
v3 ** ** x **
** v1 = [h (Y1 - Y0), w h, - w **** (Y3 - Y0)]
Výsledný normálový vektor n získame ako súčet normál susedných segmentov (pretože ide o priemernú normálu).
- n = N14 + N42 + n23 + N31 = [2 h (Y1 - Y2), 4 w h, 2 w (Y4 - Y3)]
Pre zjednodušenie môžeme vektor merateľne skrátiť, získame tak výsledný vzťah pre výpočet normály:
- n = [h (Y1 - Y2), 2 w h, w **** (Y4 - Y3)]
Po výpočte normálového vektora musíme vektor normalizovať - čo znamená, že jednotlivé zložky vydelíme dĺžkou vektora. Dĺžku vektora vypočítame ako odmocninu zo súčtu druhých mocnín jednotlivých zložiek vektora.
Ďalším dôležitou operáciou je výpočet výšky v teréne. U programovo generovaného teréne nám už nepomôže systém Petr a musíme výšku počítať sami. V skutočnosti sme tento výpočet potrebovali už skôr, na výpočet normál terénu.
Pri výpočte výšky si najskôr pripravíme výšky vrcholov segmentu, do ktorého daná súradnice patrí. Vzhľadom k tomu, že výška udávaná v prvku plochy sa vzťahuje k ľavému hornému rohu segmentu (pri pohľade zhora), potrebujeme k zisteniu výšok aktuálne políčko, políčko vpravo a obdobné políčka o riadok nižšie.
Výšku v teréne nemôžeme len jednoducho interpolovať medzi vrcholmi segmentu. Musíme počítať s tým, že segment sa skladá z dvoch trojuholníkov, ktorých zlom prechádza stredom segmente a to konkrétne z pravého horného rohu do ľavého dolného rohu. Preto musíme výpočet rozdeliť na dva prípady podľa toho, na ktorom z trojuholníkov sa testovaný bod nachádza. Rozlíšenie vykonáme jednoducho porovnaním súradnice X sa súradnicou Z (pracujeme v tejto chvíli už sa zlomkovú časťou súradníc, ktorá je relatívna v aktuálnom segmente). Ak je súradnice X väčšie ako súradnice Z, pohybujeme sa na pravom dolnom trojuholníka, v opačnom prípade to bude ľavý horný trojuholník. Po rozlíšenie trojuholníka už môžeme vykonať jednoduchú interpoláciu výšky podľa aktuálnej súradnice.
.... pokračovanie nabudúce
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 251x (6.09 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Petr Lite (sú obsiahnuté v EXE súbore, ktorý možno v programe priamo otvoriť)