úloha 062: Animace scény pro ray-tracing

Úkolem je implementovat animaci scény do paprskového zobrazovače (IRayScene). Scéna se má měnit v čase jakýmkoli vhodným způsobem, např. implementací translačních a rotačních pohybů jednotlivých částí, animací textury, volnými pády či vrhy, odrážejícími se tělesy, ..
Ideální (ale možná pracné) by bylo navrhnout nějaký jednoduchý skriptovací systém, pomocí kterého by se mohla animace scény externě definovat. Textové skripty by se daly snadno editovat a do zobrazovací aplikace načítat.

Pro inspiraci (animace kamery): v úloze 046 se již animovalo, konkrétně použitá kamera má závislost na čase. Tuto kameru jsem okopíroval do našeho projektu 062animation, 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.
Pokud budete chtít, animaci kamery můžete ve svém řešení ponechat. Ale musíte také hýbat scénou, nejen kamerou!

Důležitý 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).

Náměty: uzel stromu scény, který umí v závislosti na čase posunovat nebo otáčet přivěšeným podstromem, zvolení vhodné interpolační křivky pro hladce vypadající trajektorii, .. Pro skriptovanou translaci (tj. ne fyzikálně věrné vrhy apod.) bych doporučil některou z Hermitovských interpolačních křivek (např. Catmull-Rom spline), pro orientaci kvaterniony (obojí si můžete přečíst v prezentaci hwmath.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 RayTracingAnim.cs modifikujte definici scény class RayScene a přidejte implementaci všech vašich nových tříd.
Navrhněte nějakou zajímavou animaci, která by váš kód dobře demonstrovala. Data animace (skript) můžete vložit do programu. pokud se vám demo-animace podaří, přihlašte své řešení i do úlohy 061.

Co odevzdat: musíte poslat zdrojový soubor RayTracingAnim.cs. Navíc mi napište, pro jaký časový interval máte data animace navržena. U této úlohy ocením, když vyrobíte video a uploadnete ho např. na YouTube.

Výroba video-souboru: viz např. tento návod. Binárku ffmpeg pro Windows si můžete stáhnout např. zde. Příklad BAT souboru pro zakódování AVI souboru najdete přímo v repository (encode.bat).

Animations ukázky animace kamerou

TERMÍN: do 4. 5. 2014

BODY: základ 22 bodů

PROJEKT: 062animation

ZDROJOVÝ SOUBOR: RayTracingAnim.cs


[Cvičení NPGR004]  [Návody k zápočtům v C#]  [Ray-tracing v C#]  [Přednášky a semináře]

Valid XHTML 1.1 Copyright (C) 2012-2014 J.Pelikán, last change: $Date: 2014-10-14 23:22:53 +0200 (Tue, 14 Oct 2014) $
Send comments/requests to pepca.at.cgg.mff.cuni.cz