Kapitola 4: Lekce 1 - Modelování budovy podle reálné předlohy


Modelování fasád

Tato část bude nejkomplexněji pojatou kapitolou týkající se vytváření modelu reálné budovy. K převodu do 3D modelu je potřeba nejprve si připravit dostatek podkladů. Je možné použít fotografie – z volně přístupných fotobank či z vlastních zdrojů, případně si lze obstarat nákresy, výkresovou dokumentaci a další materiály budovy. V našem případě se budeme soustředit především na principiální správnost postupu modelování – tj. správné rozvržení fasády. Po faktické správnosti modelu se zaměříme na estetickou stránku, kde použijeme nejprve obarvení fasády několika barvami, poté na budovu aplikujeme textury, díky nimž se model stane representativnějším a použitelnějším.

Podklady a analýza

Cílem modelování si zvolíme budovu z vlastních fotografií. Pohled na fasádu by měl být z dostatečné vzdálenosti, k získání co nejlepší představě o rozvržení a celkové podobě fasády. Při modelování použijeme také vlastní textury. Konkrétně texturu zdi v přízemí, zdi v ostatních patrech a texturu střechy – střešních tašek. Pro oblast výlohy v přízemí a oken použijeme texturu získanou z fotografie vyříznutím jedné z výloh a jednoho okna.

Výchozí fotografie pro modelování

Zvolili jsme si fasádu modernější budovy z minulého století, která se skládá z dominantního přízemí, viditelně vyčleněného od ostatních pater předělovou římsou a červeně zbarvenou fasádou. Čtvrté (poslední) patro je opět vizuálně oddělené římsou. Podkroví (střecha) není z fotografie patrné, nicméně vzhledem k částečně vyčnívajícím střešním oknům lze usoudit, že budova má zkosenou, nikoliv plochou střechu. V přízemí jsou výlohy (velká okna) a mohutné dveře. Okna na budově, kromě oken v posledním patře, kde vše ohraničuje dlouhá římsa, jsou doplněny parapety.

Externí objekty

Pro modelovanou budovu si pro detailnější strukturu fasády vytvoříme 3 externí objekty. První z nich je římsa oddělující poslední patro budovy od ostatních (na obrázku vyznačená modře). Druhý objekt, který externě vymodelujeme je spodní římsa, která vizuálně odděluje přízemí od dalších pater (označena zeleně). Posledním prvkem, který v našem případě budeme potřebovat je parapet objevující se pod každým oknem.

Vyznačené, externě modelované, objekty

Tyto prvky později importujeme na patřičná místa tvořené fasády s tím, že upravíme jejich velikost a poměr jednotlivých stran tak, aby lépe odpovídaly rozměrům modelované fasády.

3D model parapetu okna 3D model dolní římsy 3D model horní římsy oddělující 4.patro

Gramatika podle skutečné budovy

Následující úsek kapitoly je velmi podobný s první lekcí kapitoly 1, která se také zaobírá dělením fasády modelu. Pro kompaktní pojetí popisu modelování podle reálné budovy však tento postup zopakujeme, již proto, že přímo na něj budeme navazovat později.

Použijeme již vytvořenou scénu, nebo si vytvoříme novou podle postupu zmiňovaného v předchozích kapitolách. Když máme připravenou scénu, založíme si nový Rule File. Zde je potřeba si opět nejprve definovat nejdůležitější atributy. Začneme výškou celého objektu, kterou zadáme dle rozvážení. Vzhledem k předchozímu vytvářenému modelu z kapitoly 4, zvolím třeba 20, jelikož vytváříme na pohled menší budovu. To ovšem není tak podstatné, jelikož můžeme vygenerovat budovu i větší, s více patry, nicméně se pro začátek budeme řídit reálnou výškou. Také si určíme výšku přízemí a výšku pater. Jelikož vidíme, že přízemí je vyšší než další patra, bude mít velikost 5 a ostatní patra 4. Nyní je třeba inicializovat půdorys (Lot). Pomocí operace extrude() se pak námi vytvářená budova (Budova1) vygeneruje.


/* Atributy *************************************/

attr vyska = 20
attr vyska_prizemi = 5
attr vyska_patra = 4

/* Pravidla ***************************************/

Lot -->
extrude(vyska) Budova1


Pomocí příkazu comp(), se kterým jsme se již seznámili dříve, si rozdělíme model na jednotlivé segmenty. Použijeme pravidla „PredniStrana“ pro přední stranu fasády, „BocniStrana“ pro zbylé stěny a „Strecha“.


Budova1 -->
comp(f){ front : PredniStrana | back : BocniStrana | side : BocniStrana | top: Strecha}


Nyní si definujeme pravidlo „PredniStrana“, ve kterém rozdělíme fasádu pomocí funkce split (s parametrem y pro horizontální dělení). V tomto pravidlu použijeme pro jednotlivá patra parametr split.index. Ten dokáže automaticky dopočítat rozvržení jednotlivých pater na celou fasádu a přizpůsobit se ostatním rozměrům tak, aby nevznikala zbytečně velká prázdná místa mezi patry. Poslednímu patru určíme pro přehlednost například index 10. Jelikož se může v budoucnu hodit mít oddělenou hlavní (přední) stranu fasády od zbylých stěn, pravidlo „BocniStrana“ definujeme zvlášť, a v něm pak můžeme použít další pravidla. Například pokud bychom chtěli vytvářet dveře a měli by být jen na jedné straně, je toto rozdělení užitečné.


PredniStrana -->
split(y){ vyska_prizemi : Patro(split.index) // prizemi
| vyska_patra : Patro(split.index) // 1.patro
| {~vyska_patra : Patro(split.index)}* // dalsi patra
| vyska_patra : Patro(10) } // posledni patro

BocniStrana -->
split(y){ vyska_prizemi : Patro(split.index)
| vyska_patra : Patro(split.index)
| {~vyska_patra : Patro(split.index)}*
| vyska_patra : Patro(10) }


Budovu si v okně Viewport vygenerujeme a získáme výsledek vodorovného dělení.

Vygenerovaná budova po vodorovném rozdělení

Po rozdělení modelu na jednotlivá patra musíme rozdělit fasádu i vertikálně. V pravidlech PedniStrana a BocniStrana jsme použili pravidlo Patro, které si definujeme nyní. Nesmíme zapomenout vtvořit nový atribut „sirka_dlazdice“, který určuje, jak moc se fasáda svisle rozdělí. Jeho hodnotu zvolím například 5. Po stranách budovy si vytvoříme odsazená místa o velikosti 1, kterým přiřadíme pravidlo Zed, které nám později poslouží při texturování fasády a nyní nám vytvoří místo vyplněné prázdnou zdí. Prozatím toto pravidlo zadáme bez parametru, což označí plochu bez textury.


Patro(floorindex) -->
split(x){ 1 : Zed() | { ~sirka_dlazdice : Dlazdice(floorindex) }* | 1 : Zed() }


Po opětovném generování vidíme rozdělení fasády ve svislém směru.

Generovaná budova po svislém rozdělení

Teď si patro specifikujeme blíže. Vytvoříme komplexnější strukturu, kde si z pravidla „Patro“ vytvoříme „MeziPatro“, které fasádu rozdělí svisle a pravidlo „Patro“ definujeme podrobněji. Pomocí parametru „floorindex“ si v něm rozdělíme patra na několik segmentů, z nichž každý bude mít odlišné vlastnosti. V segmentu, představující přízemí (floorindex == 0) bude použito pouze pravidlo „MeziPatro“ pro svislé rozdělení. V prvním patře si připravíme pozici pro římsu, která na skutečné budově ukončuje přízemí, a kterou v podobě asset prvku později na toto místo vložíme. Také zde vytvoříme holou stěnu pravidlem „MeziPatro“, aby nám vznikla potřebná mezera, kterou z estetických důvodů (aby model více připomínal skutečnost) dimenzujeme na velikost určenou hodnotou ~1.2. Poslední patro (floorindex == 10) definujeme stejně jako první patro s tím rozdílem, že nad mezipatro vložíme ještě prázdný, nijak nerozdělený kus zdi, opět pro vytvoření přesvědčivějšího výsledku vůči skutečnosti. Ostatní patra (mezipatra) si znovu vizuálně oddělíme pravidlem „Zed“ s parametrem 0.


MeziPatro(floorindex) -->
split(x){ 1 : Zed() | { ~sirka_dlazdice : Dlazdice(floorindex) }* | 1 : Zed() }

Patro(floorindex) -->
case floorindex == 0 :
split(y){~1 : MeziPatro(floorindex)}
case floorindex == 1 :
split(y){ ~1 : Rimsa(floorindex) | ~1.2 : MeziPatro(floorindex)}
case floorindex == 10 :
split(y){ ~1 : Rimsa(floorindex) | ~1.2 : MeziPatro(floorindex) | 1 : Zed()}
else :
split(y){~1 : Zed() | ~1.2 : MeziPatro(floorindex)}


Nyní vidíme oddělení jednotlivých pater mezerami. Z důvodů oddálení modelu došlo ke zkreslení některých přímek na modelu tak, že se zdají křivé, nicméně se jedná pouze o kolmé a svislé dělení fasády.

Oddělení jednotlivých pater

Je potřeba také odlišit dlaždice v přízemí a v ostatních patrech, abychom v přízemí vytvořili vizuálně mohutnější okna. Nejprve si tedy vytvoříme atributy pro šířku okna (sirka_okna) a šířku výlohy v přízemí (sirka_vylohy). Z fotografie, podle které modelujeme vyplývá, že ne všechny výlohy mají stejné rozměry. My však pro zjednodušení výkladu určíme atribut sirka_vylohy jednotný pro všechny výlohy. Atribut sirka_vylohy nastavíme na hodnotu 3.5, sirka_okna zvolíme 2.5.

Definujeme si tedy pravidlo „Dlazdice“, které aplikuje podle parametru floorindex (pro přízemí roven 0) rozdílně operaci split().


Dlazdice(floorindex) -->
case floorindex == 0 :
split(x){ ~1 : Zed() | sirka_vylohy : DlazdiceVylohy | ~1 : Zed() }
else :
split(x){ ~1 : Zed() | sirka_okna : DlazdiceOken(floorindex) | ~1 : Zed() }


Po generování modelu vidíme oddělená okna a výlohy v přízemí. Vznikly nám mezery tvořené zdmi, které dotváří již realističtější dojem.

Model budovy po vytvoření mezer mezi okny a výlohami

V další lekci si rozebereme používání detailních prvků architektury.