-
Notifications
You must be signed in to change notification settings - Fork 6
Uvod do gramatického modelovania
Gramatiky pre procedurálne modelovanie sa začali používať v 70-tych rokoch. Ich popularita stúpala aj klesala. V poslednom desaťročí zažívajú renesanciu a tešia sa čoraz väčšej obľube. Dôvody pre použivanie gramatík su najmä:
- Abstrakcia Malý objem dát popisuje mnoho variácií
- Recyklácia Pravidlá sa dajú použiť pri tvorbe ďalších modelov
- Popisnosť Pravidlá dodávajú geometrickým operáciam zmysel
Gramatika je súbor pravidiel, ktoré menia objekty v scéne. Každé pravidlo má presne defnované aké objekty môže meniť a akým spôsobom ich mení. Zatiaľ si veľmi neformálne môžeme predstaviť pravidlo, ktoré končeku halúzky pridá púčik. Gramatike musíme na začiatku zadať neprázdnu počiatočnú scénu, na ktorej bude pracovať až kým sa všetky objekty nedostanú do finálneho stavu. Finálny stav objektu sa dá určiť pomocou podmienok typu "Ak je to púčik, tak je finálny". Objekt sa stane finálnym aj vtedy, keď sa už nedá pozmeniť žiadnym pravidlom. Gramatika sa ľahko môže zacykliť, preto zvykneme po nejakom (veľkom) počte odvodení vyhlásiť scénu za finálnu.
Počiatočná scéna zvyčajne obsahuje jeden jednoduchý objekt, ktorý sa ďalej vyvíja. Každý objekt v sebe nesie niekoľko typov informácií:
- Poloha Matica určujúca polohu v priestore (pozícia, natočenie, zväčšnie).
- Geometria Originálny koncept pracoval iba s kvádrami. Rozšíril som ho na ľubovoľné polyhedrá.
- Symbol Pozostatok z textových gramatík, používa sa pre základný popis objektu a hľadanie vhodných pravidiel.
-
Atribúty Asociatívne pole s doplňujúcim popisom, napr.
{color = "red", height = "0.2"} - Materiál Farba, textúra, všetko čo partí k výzoru.
Pravidlo je postupnosť príkazov. Len posledný príkaz môže objekty deliť alebo spájať. Terminológia pri rozlišovaní príkazov a pravidiel býva často nedôsledná. Napokon z kontextu sa väčšinou dá rýchlo a jednoznačne pochopiť či sa formálne jedná o pravidlo alebo príkaz.
Pravidlá budeme triediť do niekoľkých rodín, podľa toho akým spôsobom menia objekty v scéne. Každá rodina obsahuje niekoľko tried. Pravidlá z jednej triedy vykonávajú rovnaký typ zmien na objektoch, líšia sa však v konkrétnych hodnotách. Napríklad Translate(1.0, 1.5, -1.0) a Translate(0.3, 0.2, 0.1) patria do triedy Translate. Triedy Translate, Rotate, Scale a Reflect patria do spoločnej rodiny AffineTransformations. Rozlišujeme nasledujúce rodiny:
-
AffineTransformations(Translate,Rotate, ...) -
Appearance(Color,Reflection,Emission, ...) -
Meaning(Symbol,Attribute, ...) -
Generative(Split,Components,Extrusion, ...) - časom pribudnú ďalšie rodiny
Každá trieda pravidiel má pevne danú množinu parametrov pre svoje pravidlá. Napríklad pravidlá triedy Translate budú mať parametre dx, dy, dz, kým pravidlá triedy Color budú mať parametre r, g, b, a. Ak by sme zadávali parametre pravidiel napevno (a nepoužili nerozhodnosť), gramatika by vždy generovala tú istú scénu. Preto sa pri jednoduchej parametrizácií zvyknú zadávať intervaly z ktorých sa náhodne vyberú hodnoty, napr. Color(Rnd(0.9, 1.0), Rnd(0.0, 0.3), Rnd(0.0, 0.3)) zmení farbu na odtieň červenej. Zložitejšia parametrizácia môže byť založená na výpočte funkcií ako Color(() => {var g = Rnd(0.0, 0.3); return new Vec3(Rnd(0.9, 1.0), g, 0.3 - g)}). Parametrizácia je silný nástroj pre lokálne variácie, čisto parametricý systém nemôžeme označiť za procedurálne modelovanie. Chýbajú totiž topologické variácie, ktoré určujú štruktúru objektov aj ich rozmiestnenie v scéne.
Často sa stáva, že niektorý objekt v scéne môže meniť viacero pravidiel. Vtedy sa gramatika náhodne rozhodne, ktoré z nich použije. Pravidlá môžu mať zadanú váhu, ktorá je zohľadnená pri pravdepodobnostnom výbere. Gramatiky v ktorých sa na rovnaký objekt môže použiť viacero pravidiel nazývame nedeterministické. Väčšina gramatík je nedeterministických a nedeterminizmus je najdôležitejším prostriedkom pre vytváranie variácií v štruktúre.