Kapitola 4: Lekce 3 - Barvy a textury
V této lekci využijeme model vytvořený v předchozí lekci.
Barvy
Nyní pro názornost (prozatím bez texturování) použijeme funkci color() pro obarvení modelu.
Začneme definováním čtyř základních barev, objevujících se na vytvářené fasádě. Všechny tyto barvy byly odvozeny z původní fotografie fasády vytvářené budovy, pomocí nástroje „Color Picker Tool“ v grafickém software Gimp.
attr barvaOken = "#7C90A0"
attr barvaPrizemi = "#9A4E53"
attr barvaVylohy = "#444444"
attr barvaZdi = "#A99B89"
Pomocí atributu „barvaZdi“ si nyní obarvíme zdi v jednotlivých patrech. Vložíme funkci color() s atributem „barvaZdi“ do pravidla „Patro“ ke všem případům, kromě přízemí. Do segmentu pro přízemí (stav floorindex == 0) vložíme funkci s atributem „barvaPrizemi“.
Patro(floorindex) -->
case floorindex == 0 :
color(barvaPrizemi)
split(y){~1 : MeziPatro(floorindex)}
case floorindex == 1 :
color(barvaZdi)
split(y){ ~1 : Rimsa(floorindex) | ~1.2 : MeziPatro(floorindex)}
case floorindex == 10 :
color(barvaZdi)
split(y){ ~1 : Rimsa(floorindex) | ~1.2 : MeziPatro(floorindex) | 1 : Zed()}
else :
color(barvaZdi)
split(y){~1: Zed() | ~1.2: MeziPatro(floorindex)}
Ještě provizorně nabarvíme okna a výlohy, opět pomocí již definovaných atributů.
Okno -->
color(barvaOken)
s('1,'1,-0.2) [i("builtin:cube") Zed()]
Vyloha -->
color(barvaVylohy)
s('1,'1,0.2) t(0,0,-0.2) [ i("builtin:cube") Zed()]
Pokud si nyní všimneme modelu, vidíme, že prostor mezi výlohami v přízemí a spodní římsou je obarven šedou barvou, stejně jako zdi na zbytku fasády. Tento prostor má však na skutečné budově barvu, jako oblast mezi výlohami, kterou jsme již výše obarvili. Proto prostoru pod spodní římsou musíme přiřadit opět barvu reprezentující atribut „barvaPrizemi“.
Rimsa(floorindex) -->
case floorindex == 1 :
split(y){~0.3 : color(barvaPrizemi) Zed() | ~0.1 : s('1,'1,0.3) AssetRimsa1 | ~0.3 : Zed()}
case floorindex == 10 :
split(y){~1 : Zed() | ~0.2 : s('1,'1,0.3) AssetRimsa2}
else : Zed()
Zbývá již jen nastavit barvu samotné spodní římsy, stejnou jako má celé přízemí. A v pravidlu „Strecha“, které jsme dosud nedefinovali vůbec, si určíme, že barva střechy modelované budovy bude stejná, jako barva omítky v celé horní části.
AssetRimsa1 -->
color(barvaPrizemi) i(rimsa1_asset) Zed(0)
Strecha -->
color(barvaZdi)
Po aktualizování modelu vidíme konečný výsledek modelu s plochou střechou. Takto vypadající budova by mohla být použita pouze pokud bychom modelovali nějaký typ staršího panelového domu.
Jak již bylo zmíněno při rozboru budovy na začátku kapitoly, z fotografie je patrná zešikmená střecha, nikoliv plochá. Proto jí nyní u modelu blíže specifikujeme. Jako vhodnou jsem vybral střechu typu Hip. Funkcí „set(trim.horizontal, true)“ povolíme vodorovné zarovnávací plochy střechy k docílení požadovaného zobrazení.
Strecha --> roofHip(28, 0) TypStrechy
TypStrechy --> set(trim.horizontal, true)
comp(f) { all : Str }
Po následném generování modelu dostaneme výsledek. Pro reálnější představě o momentální podobě objektu si můžeme vypnout drátové zobrazení.
Abychom mohli model budovy pokládat za kompletní, je vhodné se zaměřit také na estetickou stránku. Proto se nyní zaměříme na texturování.
Jak již bylo zmíněno dříve, použijeme několik druhů textur. Na větší plochy aplikujeme textury zdi – pro přízemí a pro zbylá patra, a také texturu střešních tašek pro oblast střechy. Na okna a výlohy v přízemí máme připravené textury, které jsme vyříznuli ze zdrojové fotografie modelované budovy.Nejprve načteme textury, které budeme používat. V našem případě se nacházejí ve stromě projektu ve složce facades. Každé textuře přiřadíme jednoznačný a vypovídající název.
tex_okno = "facades/textura_okno1.jpg"
tex_strecha = "facades/textura_strecha3.jpg"
tex_zed = "facades/textura_zed8.jpg"
tex_prizemi = "facades/textura_zed5.jpg"
tex_vyloha = "facades/textura_vyloha1.jpg"
Nyní si definujeme pravidlo Zed(), které jsme již několikrát při psaní kódu aplikovali. Tato část bude pro texturování zásadní. Rozlišíme si několik stylů. Pro každý styl určíme barvu plochy, texturu, kterou na ní namapujeme a pomocí funkce “projectUV()” také formu mapování. První styl bude použit pro zeď v patrech - hnědo-šedá textura, druhý styl na střechu, třetí styl v místech oken, čtvrtý s texturou červené omítky v přízemí a pátý do výloh. Pro jistotu si pro všechny ostatní místa zvolíme zaplnění texturou zdi.
Zed(style) -->
case style == 1 :
color(barvaZdi) texture(tex_zed) projectUV(0) projectUV(2)
case style == 2 :
color(barvaPrizemi) texture(tex_strecha) projectUV(0) projectUV(1)
case style == 3 :
color(barvaOken) texture(tex_okno) projectUV(1) projectUV(1)
case style == 4 :
color(barvaPrizemi) texture(tex_prizemi) projectUV(0) projectUV(1)
case style == 5 :
color(barvaVylohy) texture(tex_vyloha) projectUV(1) projectUV(1)
else :
color(barvaZdi) projectUV(2)
Dále nesmíme zapomenout všude v kódu, kde jsme vložili pravidlo Zed(), vložit do závorky patřičné číslo stylu odpovídající vzhledu budovy na daném místě, podle sepsané specifikace. Dále si ještě vytvoříme pravidlo „Str“ pro správné zobrazení textury střechy.
Str --> Zed(2)
Pro nejkvalitněji vygenerovaná výsledek si zapneme osvětlení scény (klávesa „L“), vypneme drátování modelu (klávesa „7“ nebo kliknutím na patřičnou ikonku v menu nahoře) a ještě si zkontrolujeme, zda máme v menu zapnuté stínování. Po vygenerování získáváme konečnou podobu námi modelované budovy.
Z větší dálky bohužel nevidíme dostatečně použité textury, které se i kvůli vykreslovacím schopnostem prostředí CityEngine objevují až po přiblížení modelu. Na obrázku vidíme textury detailněji.
Níže je ukázka vrml modelu budovy:
Tuto budovu můžeme použít například při generování modelů měst a městských částí.
Následující kapitola popisuje další použití modelování v CGA.