Úloha 039: Generování terénu

Terrain aplikace

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.

Princip

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.

Kroky algoritmu

Literatura

Další informace lze najít například zde:

  • přesnější popis metody, teoretický úvod, vzorce - Moderní Počítačová Grafika, autoři Žára, Beneš, Sochor, Felkel, nakladatelství Computer Press, 2004 (8.1.5 Náhodné fraktály, sekce Brownův pohyb a Metoda náhodného přesouvání středního bodu)
  • Generating Random Fractal Terrain
  • na Googlu
Je možné implementovat i jiné netriviální metody (individuální hodnocení v mezích současného hodnocení), např.:

Implementace

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.

Termín

Odevzdat do: 28. 2. 2015

Body

Až 18b + bonus:

  • 10b - základní generování neotexturovaného/jednobarevného terénu s nastavením hladkosti/hrubosti a počtu iterací (při změně počtu iterací se zjemní/zhrubne existující terén, negeneruje se úplně nový, maximální počet iterací je omezen jen pamětí). Alespoň nějaké normály. Nastavení rozměrů pohoří (jednotek na stranu a na výšku).
  • 4b - inicializace výškové mapy z PNG (např. rozměrů 2×2, 3×3, až 33×33).
  • 2b - interpolace normál ve vrcholech.
  • 2b - základní texturování terénu.
  • bonus - za zajímavé řešení, rozšíření (tvorba sopek (jen) z některých vrcholků obracením jejich špiček, asymetrie údolí a pohoří, dynamické nastavení úrovně vody, atd.), hezké vykreslení (více textur, vodní hladina, průhledná vodní hladina, atd.).

Projekt

Visual Studio 2010 projekt: 039terrain

Zdrojový soubor

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)