Úloha 064: Rozmazání pohybem pro ray-tracing

Úkolem je modifikovat zobrazovací metodu ray-tracing tak, aby se u rychle se pohybujících objektů ve scéně objevilo rozmazání pohybem (jako při delší uzávěrce při fotografování).

Motion blur

Koncepce

Zabudujte svůj mechanismus do již existujícího frameworku (ray-tracing s distribucí řízenou anti-aliasingem - viz parametry rank a total) tím, že přeprogramujete metodu vzorkování - jednotlivé paprsky je třeba vysílat v různých časech z daného intervalu. Vzorkování v jednotlivých pixelech musí být nezávislé, tj. časové okamžiky musí být zvoleny pokaždé jinak.

Budete muset implementovat potomka třídy RayTracing, který bude počítat s faktem, že se mají jednotlivé vzorkyv jednom pixelu počítat v různých časech. Časovou veličinu bude muset předávat všem zainteresovaným objektům (můžete použít AnimatedScene a na zkoušku i AnimatedCamera z projektu 062animation, musíte je však okopírovat do aktuálního zdrojového souboru MonteCarloRT.cs).

Interface ITimeDependent

Nastavuje se přes něj aktuální čas libovolnému objektu, který umí být závislý na čase. Pozor: protože se výpočty paralelizují, je potřeba vždy dodržovat re-entranci vašeho kódu. Standardně se to zajišťuje tak, že si každé vlákno naklonuje svou vlastní kopii scény, pokud je ta scéna časově závislá (interface ITimeDependent). Detaily viz AnimatedRayScene.Clone() - každý objekt implementující interface ITimeDependent se musí umět naklonovat (tzv. "deep-copy" pro časově závislá data).

Animace kamery (jen pro inspiraci)

V projektu 062animation je na ukázku jednoduchá animovaná kamera, můžete se tam podívat, jak se používá interface ITimeDependent (pro obecnou závislost objektu na čase). Celá RT scéna je uzavřena do objektu IRayScene, v tomto konkrétním případě je již class AnimatedScene : AnimatedRayScene, tj. nastavování času pro celou scénu je tam již implementováno.

Animace ve stromu scény

Uzel stromu scény, který umí v závislosti na čase posunovat nebo otáčet přivěšeným podstromem.. Toto je však jen jedna komponenta, kterou musíte modifikovat. Aby byl mechanismus časové animace v grafu scény funkční, je potřeba:

  1. používat definici scény odvozenou od AnimatedRayScene, aby bylo zajištěno nastavování času (property double Time) pro všechny základní části scény, geometrii, kameru a světelné zdroje.
  2. v grafu scény použít v klíčových místech (např. jako kořen stromu) novou modifikaci třídy CSGInnerNode - takovou, která bude sama implementovat interface ITimeDependent. Tj. bude umět dále propagovat časový údaj a dále musí umět selektivně klonovat své komponenty (potomky ve stromu). Potomci implementující interface ITimeDependent musí být naklonovány, ty ostatní lze sdílet.
  3. implementovat vlastní animační uzly - třídy odvozené od běžného uzlu CSGInnerNode, tyto třídy musí implementovat interface ITimeDependent a na změnu času reagovat požadovaným způsobem - změnou transformace připojeného tělesa, animací texturových souřadnic, apod. Až tento poslední typ uzlu vykonává skutečnou "animační práci", předchozí dva body se však nesmí zanedbat, jinak by animace nebo rozmazání pohybem nefungovaly.

Vlastní animace (pohyb): pro translaci lze použít známé animační křivky, pro orientaci (otáčení) kvaterniony (obojí viz prezentaci hw-08-math.en.pdf).
Implementace: některé křivky jsou mj. v jazyce C implementovány v repository ogl, stejně tak kvaterniony. Kvaterniony máme též v knihovně OpenTK, která se již v našich projektech používá.

Co modifikovat

Ve zdrojovém souboru MonteCarloRT.cs modifikujte definici scény class RayScene (musí být odvozena od AnimatedRayScene jako v projektu 062animation). Přidejte minimálně jeden prvek scény, který se bude v čase měnit (neakceptuji kameru, tím by se rozmazalo všechno, ale na zkoušku vašeho časového frameworku můžete zpočátku pro testování použít AnimatedCamera z 062animation).

Dále musíte vytvořit novou třídu jako potomka class RayTracing - stačí přeprogramovat funkci long GetSample ( double x, double y, int rank, int total, RandomJames rnd, double[] color ) a při každém volání v rámci jednoho pixelu (to poznáte podle poklesu hodnoty rank) nastavte scéně (a příp. i kameře) jiný čas. Jako vzorkování na časové ose se asi nejlépe hodí Jittering, viz přednášky.
Tato rozšířená funkce ray-tracingu bude muset znát rozsah času (interval otevření simulované závěrky) a do výpočtu ji zapojíte pomocí funkce IImageFunction getImageFunction ( IRayScene scene ).

Co odevzdat

Musíte poslat zdrojový soubor MonteCarloRT.cs a případně nějaký pěkný výstupní obrázek.

Termín

Odevzdat do: 2. 7. 2017.

Body

Základ: 25 bodů (smysluplný pohyb ve scéně rozmazaný pohybem),
bonus za zajímavé nápady, parametrizaci pohybu (délku expozice předávanou přes "Param"), apod.

Projekt

Visual Studio projekt: 048rtmontecarlo

Zdrojový soubor

Modifikujte a odevzdejte soubor: MonteCarloRT.cs
Do komentáře na první řádce napište své jméno!


Copyright (C) 2012-2017 J.Pelikán, last change: 2017-05-19 01:16:33 +0200 (Fri, 19 May 2017)