Úloha 079: Implicitní plocha pro ray-tracing

Ú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.

Implicit flake (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.

Náměty

O implicitních plochách a jejich kreslení v paprskových zobrazovačích se můžete dočíst v následujících pramenech:

Matematicky: kořeny funkce (po dosazení rovnice paprsku do F(x,y,z)) můžete hledat některou běžnou metodou, půlením intervalu, metodou sečen, Fibonacciho hledáním, apod. Efektivnější přístupy budu oceňovat body navíc, nejprve si však implementujte nějakou jednoduchou metodu pro ladění. Přesnost výpočtu průsečíků i normálových vektorů (absence artefaktů na obrysu těles) mají nejvyšší prioritu!

Technicky

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).

1. Nové těleso

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, ..

2. 3D scéna

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é.

Co modifikovat

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.

Co odevzdat

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.

Termín

Odevzdat do: 10. 6. 2018

Body

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.

Projekt

Visual Studio projekt: 048rtmontecarlo nebo 048rtmontecarlo-script.

Zdrojový soubor

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)