Vytvořte program, který bude generovat a vykreslovat (fraktální) terén. Uživatel by měl mít možnost nastavit počet iterací algoritmu a hladkost/hrubost výsledku. Při této úloze byste si měli mimo jiné vyzkoušet práci s 3D daty a naučit se něco nového o procedurálních metodách v počítačové grafice.
Algoritmus začíná se čtyřmi vrcholy umístěnými v rozích čtverce. Doprostřed čtverce se přidá nový bod, jehož výška se dopočte jako průměr výšek těchto čtyř bodů ("diamond step"). Pro přidání bodu je potřeba mřížku s vrcholy zjemnit, v důsledku čehož se nám objeví další čtyři nové vrcholy. Jejich výšky opět vypočteme jako průměr výšek (zde 3, v dalších iteracích typicky 4) sousedících bodů ("square step"). Metodu rekurzivně/iterativně aplikujeme na (nejmenší) čtverečky vzniklé mřížky. Princip algoritmu je ilustrován na obrázku.
Tímto způsobem bychom pouze interpolovali výšky krajních vrcholů počáteční mřížky a výsledná plocha by byla hladká. Proto k výšce každého nově přidaného vrcholu přidáme náhodné posunutí. Rozsah hodnot, kterých náhodné číslo nabývá, je klesající (případně nerostoucí) s číslem iterace algoritmu a určuje hladkost terénu. Vzorec můžete použít vlastní nebo převzít některý z uvedené literatury.
Další informace lze najít například zde:
Jako kostru aplikace použijte projekt 039terrain
z repository grcis.
Budete hlavně přepisovat metodu Regenerate(), která se vyvolává
při změně parametrů terénu a stisku tlačítka "Regenerate terrain".
Připravena je třída SceneBrep, do které můžete snadno přidávat nové vrcholy (AddVertex()),
jejich normály (SetNormal()), texturové souřadnice (SetTxtCoord()) a případně barvy
(SetColor(), viz metoda Render()); jejich použití je ilustrováno
v glControl1_Load(). Vykreslení dat ze třídy SceneBrep a jednoduchá kamera jsou
implementovány v metodách Render() a SetCamera() a pro úspěšné odevzdání je
není nutné (ale ani zakázané) měnit - stačí vygenerovaná data převést na trojúhelníkovou síť.
Konverze dat ze SceneBrep a jejich nahrání na grafickou kartu je v metodě
PrepareData(). Pomocná knihovna pro nahrávání textur je v souboru
TexLib.cs. Před implementací se zamyslete, jestli při řešení použijete rekurzi
nebo iteraci.
Reakce na tlačítko Regenerate: je potřeba zachovávat spojitost terénu při pouhé změně počtu iterací! Tj. reagujte na tlačítko "Regenerate terrain" tak, že přegenerujte celý model od základů pouze v případě zmeny "roughness" anebo při explicitním stisku tlačítka ve formuláři (to poznáte tak, že se ani jeden parametr nezměnil), jinak - při změně "iterations" - dogenerujte zbylé úrovně resp. nejjemnější úrovně zrušte. Terén by neměl při změně počtu iterací divoce poskakovat, jen se lehce zjemňovat..
Odevzdání: jako řešení úlohy posílejte mailem modifikovaný zdrojový soubor Terrain.cs (jen výjimečně přibalte i modifikovaný soubor Support.cs). Pokud jste vymysleli nebo použili jinou než výše popsanou metodu, doplňte ji krátkým průvodním textem. To samé platí pro zajímavá rozšíření, ať si jich všimnu. Pokud něco nefunguje úplně dobře, ale dali jste si s tím práci, zmiňtě to. Můžete poslat i hezký screenshot nebo odkaz na galerii.
Odevzdat do: 28. 2. 2015
Až 18b + bonus:
Visual Studio 2010 projekt: 039terrain
Modifikujte a odevzdejte soubor: Terrain.cs (příp. i Support.cs)
Do komentáře na první řádce napište své jméno!
Nezapomeňte na krátký průvodní text.
Copyright (C) 2011-2015 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)