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

Inspirace (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!

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

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 je třeba, abyste sami vyrobili video a uploadnuli ho např. na YouTube. Odkaz na vystavený video-soubor pošlete spolu se zdrojovým souborem.

Výroba video-souboru

Pro výrobu videa z jednotlivých snímků použijte 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

Odevzdat do: 22. 5. 2016. Na poslední přednášce pak promítnu několik nejpovedenějších výsledků.

Body

Základ: 22 bodů (smysluplná animace, vyrobený a zveřejněný video-soubor),
bonus za zajímavé nápady, ozvučení, apod.
soutěž: po termínu odevzdání vystavím všechny výsledky na webu a budete moci hlasovat pro videa, která se vám budou líbit. Nejlepší autoři budou oceněni dalšími body navíc.

Projekt

Visual Studio projekt: 062animation

Zdrojový soubor

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

Soutěž

Hlasujte na stránce soutěže, do 12. 6. 2016.


Copyright (C) 2012-2016 J.Pelikán, last change: 2020-05-16 23:04:24 +0200 (Sat, 16 May 2020)