úloha 035: Simulace plasma

Cílem je vytvořit takzvaný efekt "Plasma", který má připomínat plápolající oheň nebo rozplývající se kouř.

Plasma sample

Základem poslouží projekt 035plasma z repository grcis. Je připravena jednoduchá aplikace, ve které se používá třída Simulation obsahující triviální implementace všech důležitých metod: Simulate(), Visualize(), Reset() a reakce na události myši Mouse*().

V dané aplikaci uživatel může ovlivnit velikost výsledného obrázku (v pixelech), startovat a zastavovat simulaci, resetovat ji a ve všech režimech pomocí levého tlačítka myši kreslit do simulovaného pole.

Princip simulace je velice jednoduchý: v každém kroku se použije vážený součet na pixely/hodnoty kolem aktuálně počítaného pixelu/hodnoty a výsledek se ještě přenásobí konstantou <1, aby oheň/kouř pomalu mizel. Pozor na počítání na tom samém poli hodnot, z kterého berete zdrojové hodnoty. Vhodné je použít "staré" (tzn. právě zobrazené) pole pouze jako zdroj a výsledek zapisovat do nového pole, případně tato dvě pole střídat, aby se předešlo zbytečným alokacím.

V místech "zdroje" plamene se generují náhodné hodnoty a přičítají se k existujícímu poli.

Vylepšený výpočet může používat netriviální pole normalizovaných vektorů (pole má stejnou velikost jako simulační pole). Při výpočtu kroku algoritmu se neberou konstantní váhy, ale například skalární součet vektoru z vektorového pole a vektoru směřujícího od aktuálního cílového do aktuálního zdrojového pixelu (zdrojové pixely ... 8 sousedních pixelů). Myslete ovšem na to, že je třeba váhy normalizovat, aby jejich součet byl 1.

Momentálně je v metodě Visualize() převod z 2D pole do šedivého RGB obrázku. Vaše základní implementace musí vytvářet výsledek nějak zajímavě zabarvený. Je více možností, jak toho dosáhnout, je na Vás, pro kterou se rozhodnete. Buď můžete dělat celý výpočet přímo na RGB hodnotách a plamen ohně generovat v barvách, barevné plameny se tedy budou míchat. Další možností je nechat skalární simulační pole a přepočítávat hodnotu intenzity pomocí tzv. "look-up" tabulky, tím se dá získávat daleko širší spektrum efektů, například ostře ohraničený plamen nebo plamen měnící barvu při "chladnutí" atd.
Samozřejmě se dají různé přístupy kombinovat (vícekanálový výpočet + každý kanál vlastní LUT + výsledná kombinace výsledku, atd.), fantazii se meze nekladou. Není nutno zůstávat u RGB hodnot, dá se využít i jiný barevný prostor, například HSV...

Interakce uživatele se simulací: v aplikaci je připraven základ pro interaktivní zásahy uživatele do simulovaného pole pomocí levého tlačítka myši. Můžete například zasahovat do simulovaného pole, definovat pole zdrojových pixelů nebo editovat pole směrových vektorů. Je to zcela na Vás, k dispozici máte obsluhu třech událostí: stisk levého tlačítka myši, uvolnění tlačítka a přesun ukazatele myši (drag).

Technicky: typicky budete muset předělat tyto metody:
Při použití interakce též obsluhy událostí:

BODOVÁNÍ:
3b .. základní implementace barevné plazmy, konstantní směr výpočtu pro celý rozsah (například směr nahoru),
3b .. dodána možnost netriviálního vektorového pole, směr výpočtu může být pro každý pixel jiný, ovšem po celou dobu zůstává konstantní,
3b .. implementace s dynamickým vektorovým polem,
2b .. zdroje plamene nejsou jen pouhé generování obdélníku na spodku obrázku, ale nějak zajímavě rozmístěné, například hořící nápis atd.,
až 3b .. interakce uživatele pomocí myši,
(dohromady až 14 bodů) + bonusy

TERMÍN: do 20. 11. 2011

PROJEKT: 035plasma

ZDROJOVÝ SOUBOR: Simulation.cs

ŘEŠENÍ POSÍLEJTE Janu Horáčkovi, do předmětu připište "035plasma".


[Cvičení NPGR003]  [Návody k zápočtům v C#]  [Přednášky a semináře]  [Odkazy na demonstrace]

Valid XHTML 1.1 Copyright (C) 2011 J.Pelikán, last change: $Date: 2014-10-03 15:44:39 +0200 (Fri, 03 Oct 2014) $
Send comments/requests to pepca.at.cgg.mff.cuni.cz