Úkolem je implementovat obecnou parametrickou plochu a výpočet paprsku s ní dostatečně optimalizovat pomocí vhodné urychlovací metody. Předpokládá se, že podle parametrického předpisu vytvoříte dostatečně jemnou trojúhelníkovou síť a tu pak budete protínat paprskem..
Základem poslouží projekt 048montecarlo nebo 048rtmontecarlo-script z repository grcis. Je připravena aplikace, která umí počítat obrázek dané scény s použitím konfigurovatelného sledování paprsku a volitelného paralelismu (multi-core CPU). V případě druhého projektu se dají definice scéna načítat z externích souborů (CS-script).
Pokud použijete definici scény CS-scriptem (projekt 048rtmontecarlo-script), nemusíte se vyhodnocováním výrazu zabývat, použijte k definici parametrických funkcí lambda-výrazy.
Ve zdrojovém souboru MonteCarloRT.cs založte novou třídu
public class Parametric : DefaultSceneNode, ISolid a
do ní napište svoji implementaci (inspirace viz class Sphere).
Do definice scény (CustomScene) přidejte Vaše těleso/tělesa, možná
budete potřebovat modifikovat i polohu kamery, světelné zdroje, materiály, apod.
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.
Vaše nové těleso musí mít v konstruktoru možnost zadat symbolické vzorce definující povrch (plochu). Budou to tři funkce: x = x(u,v), y = y(u,v) a z = z(u,v). Pro jednoduchost zafixujeme definiční obor parametrů u, v na interval <0.0,1.0>. K vyhodnocování výrazu použijte externí knihovnu NCalc.dll, viz např. úlohu 059 a příslučný projekt v repository.
Pokud využijete 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.
Parametrickou plochu rozložit na velký počet maličkých trojúhelníků, ty potom efektivně protínat paprskem za pomoci některé urychlovací techniky: KD-tree nebo R-tree (BVH), případně Octree (oktantový strom). Varianty stromů s duplicitou jsou KD-tree a Octree, R-tree duplicitní trojúhelníky nesmí obsahovat. Používejte "bucket-tree", tj. listy s maximálně N trojúhelníky, např. 2 <= N <= 16 (nejlepší je deklarovat N jako konstantu a diskutovat její vliv na rychlost výpočtu).
Pozor: Váš kód musí být re-entrantní, protože se bude pouštět v paralelním prostředí! Do objektu parametrické plochy si nesmíte ukládat žádné pomocné hodnoty (specifické pro konkrétní instanci paprsku). Urychlovací struktoru (strom) musíte postavit na začátku, při inicializaci, pak už bude (pro jednotlivá výpočetní vlákna) sdílená a "read-only".
Ve třídě Geometry jsou pro Vás připraveny užitečné
metody: RayTriangleIntersection(), RayBoxIntersection() resp.
RayBoxIntersectionInv(). Ty používejte k získání průsečíku paprsku s jednotlivým
trojúhelníkem nebo obalovým kvádrem (AABB).
Nezapomeňte inkrementovat čítače CSGInnerNode.countBoundingBoxes resp.
CSGInnerNode.countTriangles počítající výpočty průseku paprsku s obalovým kvádrem
resp. s jednotlivým trojúhelníkem.
Podobná úloha v minulosti (urychlování průsečíku se sítí trojúhelníků):
050, grcis projekt 050rtmesh. Tam také najdete jednoduché
ukázky výpočtu průsečíku paprsku s trojúhelníky..
Nejen pro pokročilé:
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: 1. 7. 2018
Základ: 30 bodů (obecná plocha zadaná vzorečky, rozumná rychlost výpočtu, fungující stínování
a odrazy - normálové vektory),
Bonus: za použití zajímavých ploch, za efektivitu výpočtu, konfigurovatelné 2D texturové souřadnice.
Visual Studio projekt: 048montecarlo 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) 2013-2018 J.Pelikán, last change: 2020-05-16 23:04:24 +0200 (Sat, 16 May 2020)