Úkolem je implementovat implicitní plochy do paprskového zobrazovače (CSG scéna). Těleso bude definováno pomocí reálné prostorové funkce F předpisem F(x,y,z) = 0.
(c) 1999 Andrei Sherstyuk
V rámci řešení této úlohy musíte implementovat obecný mechanismus výpočtu průsečíku paprsku s implicitní plochou a dále navrhnout několik příkladů implicitních ploch, různě parametrizovaných. Není nutné implementovat obecné symbolické zadání vzorce funkce F, naopak se soustřeďte na rychlost a přesnost výpočtu.
O implicitních plochách a jejich kreslení v paprskových zobrazovačích se můžete dočíst v následujících pramenech:
Vaše řešení se skládá ze dvou částí: musíte založit novou třídu pro implicitní plochu (případně těchto tříd přidejte víc) - detaily viz níže. Dále musíte sestavit s pomocí této nové plochy (ploch) nějakou testovací scénu nebo několik scén a ty zapojit do list-boxu ve formuláři (příp. vyrobit CS-script definující scénu).
Ray-tracing obohatíte o těleso přidáním nové třídy,
která implementuje interface ISolid. Musíte hlavně implementovat
dvě funkce klíčové pro paprskové zobrazování: Intersect() a
CompleteIntersection() (detaily viz Průvodce
C# ray-tracerem).
Doporučený postup je založit novou třídu jako potomka DefaultSceneNode,
tak máte zaručeno, že objekt bude mít implicitně implementovány všechny důležité ostatní
funkce (kromě výpočtu průsečíků, ten musíte dodat sami). Pro inspiraci se podívejte
na class Sphere. Vaše nová deklarace třídy tedy bude moci začínat:
public class ImplicitSurface : DefaultSceneNode, ISolid { ..
Nezapomeňte počítat korektně normálové vektory (v druhé metodě -
CompleteIntersection()).
Parametry implicitní plochy zadejte v konstruktoru vaší nové třídy, je na
vás, zda nadeklarujete více různých tříd (příp. se společným předkem obstarávajícím výpočet)
nebo budete více implicitních funkcí přepínat přes delegáty, ..
Do definice scény (CustomScene nebo CS-script) přidejte vaše těleso/tělesa, možná
budete potřebovat modifikovat i polohu kamery, světelné zdroje, materiály, apod.
Pokud připravíte scén více, můžete zkopírovat metodu CustomScene.TestScene()
a nadeklarovat tak více konstrukcí - data scény se vkládají do objektu
IRayScene sc, který dostanete jako aktuální parametr při volání.
Aby se nové scény objevily v list-boxu, je třeba obohatit implementaci
funkce void InitializeScenes (), kde najdete též možnost nadefinovat default
scénu, rozlišení obrázku nebo parametry zobrazení. Tuto možnost prosím využívejte,
aby se při pouhém výběru scény ze seznamu nastavilo rozumné zobrazení.
Při použití CS-scriptu vytvořte a odevzdejte nový .cs soubor obsahující
vše potřebné.
Jako základ poslouží projekt 048rtmontecarlo nebo 048rtmontecarlo-script z repository grcis.
Do zdrojového souboru MonteCarloRT.cs přidejte implementace Vašich nových tříd (vašeho tělesa, příp. urychlovací struktury), dále modifikujte definici scény CustomScene.TestScene(), do které přidáte použití Vámi implementovaného tělesa. Pokud budete mít více ukázkových scén, nechte je všechny funkční a do listboxu přidejte další položky, aby se dalo vše pohodlně zkoušet bez nutnosti překládat program (viz inicializační funkci InitializeScenes()). Konstrukční funkci se předává textový parametr Param: z formuláře.
Pokud byste chtěli využít možnosti definovat scénu CS-scriptem, použijte projekt 048rtmontecarlo-script a popis scény vložte do nového .cs souboru (inspirace viz vestavěné scény z adresáře data/rtscenes/ a návod ke skriptování). I do skriptu je předáván textový parametr Param: z formuláře.
Musíte poslat zdrojový soubor MonteCarloRT.cs. Pokud chcete, můžete připojit několik
pěkných výsledných obrázků.
Případný script definující scénu přiložte jako další soubor.
Odevzdat do: 10. 6. 2018
Základ: 25 bodů (aspoň jedna netriviální implicitní plocha, funkční průsečíky a normály),
Bonus: za více zajímavých ploch, efektivní výpočet, apod.
Visual Studio projekt: 048rtmontecarlo nebo 048rtmontecarlo-script.
Modifikujte a odevzdejte soubor: MonteCarloRT.cs
Do funkce InitializeScenes() zadejte své vlastní jméno!
pokud definujete scénu scriptem, přiložte příslušný .cs soubor,
pokud spočítáte nějaké hezké obrázky, můžete je v menším rozlišení přiložit.
Copyright (C) 2011-2018 J.Pelikán, last change: 2020-05-16 23:04:24 +0200 (Sat, 16 May 2020)