Kapitola 4: Lekce 2 - Detailní prvky architektury



Příprava fasády

Budeme pokračovat v modelování námi vytvořené budovy z lekce 1. Nyní si připravíme v pravidlu „Dlazdice“ již používané prvky „DlazdiceOken“ a „DlazdiceVylohy“. Ty nám blíže specifikují vzhled oken a výlohy v přízemí. Vidíme, že u dlaždice pro okna budeme společně s okny vkládat i parapet. Ten si definujeme později. Okno v posledním patře mít parapet nebude, protože místo něho vložíme horní římsu, která povede přes celou šířku fasády. Abychom dosáhli reálnějšího vzhledu modelu, budou okna i výlohy do budovy zasazené. To dosáhneme jejich posunutím směrem do modelu. Tím nám ovšem vzniknou mezery mezi těmito prvky a ostatní fasádou. Proto si vytvoříme pomocná pravidla „PlnaZed“ a „PlnaZedVyloha“ která nám tyto místa vyplní zástupnými krychlemi.


DlazdiceOken(floorindex) -->
case floorindex == 10 :
split(x){ 0.01 : PlnaZed | ~2 : split(y){0.01: PlnaZed | ~1: Okno t(0,'1,0) | 0.01: PlnaZed} | 0.01 : PlnaZed }
else :
split(x){ 0.01 : PlnaZed | ~2 : split(y){ 0.01: PlnaZed | ~1: Okno Parapet | 0.01: PlnaZed } | 0.01 : PlnaZed }

PlnaZed -->
s('1,'1,0.4) t(0,0,-0.4) i("builtin:cube:notex") Zed()

DlazdiceVylohy -->
split(x){ 0.01 : PlnaZedVyloha | ~2 : split(y){0.01: PlnaZedVyloha|~1: Vyloha|0.01: PlnaZedVyloha} | 0.01 : PlnaZedVyloha }

PlnaZedVyloha -->
s('1,'1,0.4) t(0,0,-0.4) i("builtin:cube:notex") Zed()


Další lekce ukazuje, jak použít přídavné prvky (assets) na této fasádě.

Již máme tedy připravené dlaždice (prostory) pro okna a výlohy. Ty si teď definujeme blíže. V pravidlech „Vyloha“ a „Okno“ nahradíme stávající plochou zeď trojrozměrnými krychlemi pomocí operace i(). To nám může dobře posloužit při pozdějším vkládání prvků typu asset, které budou externě vymodelovány. Tyto prvky můžeme buď nechat ve tvaru jednoduchého geometrického prvku, nebo vložíme texturu s požadovaným objektem na patřičné místo, popřípadě, jak již bylo zmíněno, můžeme vytvořit 3D model prvku se všemi detaily. Já zde prozatím použiji zástupné krychle. Později k nim přidáme zmíněné textury.


Okno -->
color(barvaOken)
s('1,'1,-0.2) t('0,'0,-0.1) [i("builtin:cube") Zed()]v
Vyloha -->
color(barvaVylohy)
s('1,'1,0.2) t(0,0,-0.3) [ i("builtin:cube") Zed()]


Na pohled se nám model budovy nijak nezměnil, ale pokud přiblížíme pohled do vnitřku budovy (zoom), můžeme si všimnout, že místo oken jsou již krychle transponované výše zmíněnými operacemi s() a t() do vnitřku budovy tak, aby nevyčnívaly z fasády.

Přídavné prvky

Nyní je čas vložit si do našeho projektu asset prvky. Ty se dají importovat například ve stromě projektu (okno Navigator). V jeho kořenovém adresáři nalezneme složku „assets“ a v ní si vytvoříme pro přehlednost podsložku facades, ať se držíme anglického názvosloví ve stromě. Tu vytvoříme pravým tlačítkem na „assets“ – New – Folder. Pravé tlačítko pak použijeme i na nově vzniklou složku facades, vybereme New a File. V okně „New File“ klikneme na tlačítko „Advanced“, zaškrtneme „Link to file in the file system“ a procházením složek najdeme zdrojový objekt. Pro tento návod jsme volili již zmíněný formát .OBJ. Stejným způsobem si do projektu importujeme všechny vymodelované prvky.

Teď musíme prvky aktivovat i ve vytvářeném RuleFile. O asset prvcích jsem se zmiňoval již na začátku kapitoly. Budeme používat parapet pod okny, dolní římsu oddělující přízemí (rimsa1) a římsu, která je umístěna pod posledním oknem domu (rimsa2). Deklarujeme si je jako konstanty na začátku souboru, hned za existujícími atributy, a označíme je podle typu prvku.


const parapet_asset = "facades/parapet.obj"
const rimsa1_asset = "facades/rimsa1.obj"
const rimsa2_asset = "facades/rimsa2.obj"


Začneme definicí pravidla Parapet, které jsme již použili u prvku „DlazdiceOken“. Jeho velikost upravíme pomocí operace s() a zkoušením vhodného poměru mezi jednotlivými souřadnicemi.


Parapet -->
s('1.1, -0.3, 0.1) center(x) i(parapet_asset)


Model s importovanými parapety

Pravidlo „Rimsa“ jsme použili již při vytváření pater, kde jsme si v prvním a posledním patře vymezili prostor právě pro vložení říms. Nyní si toto pravidlo definujeme zvlášť pro první a poslední patro, opět pomocí parametru floorindex. Římsa v posledním patře, na rozdíl od té dolní, není nahoře oddělena od okna mezerou tvořenou zdí.


Rimsa(floorindex) -->
case floorindex == 1 :
split(y){~0.3 : 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()


Teď ještě zbývá si definovat použité AssetRimsa1, pro dolní římsu a AssetRimsa2 pro římsu oddělující poslední patro od zbytku budovy. Operací i() můžeme vložit na místa určená pro římsy nejprve pouze některý z geometrických prvků, zabudovaných již v samotném CityEngine, abychom správně nastavili velikost a umístění později vkládaných, externě vymodelovaných objektů. Jelikož se však jedná o poměrně jednoduchý útvar, jako je římsa, můžeme je vložit rovnou a to zadáním patřičných parametrů do příkazu i().

Parametry budou již deklarované proměnné „rimsa1_asset“ pro dolní římsu a „rimsa2_asset“ pro římsu horní.

AssetRimsa1 -->
i(rimsa1_asset) Zed()

AssetRimsa2 -->
i(rimsa2_asset) Zed()


Výsledný model s parapety i římsami

Níže je ukázka vrml modelu budovy, při použití sepsaných pravidel CGA gramatiky:



Další lekce této kapitoly popisuje obarvení a texturování fasády.