Úloha 116: Animovaná realtime kamera

Úkolem je navrhnout animovanou kameru pro použití v realtime 3D programu. Vaše kamera bude použita v prohlížeči 3D scén 086shader jako alternativa interaktivního systému "Trackball". Budete pouze řídit transformační matice ("Model-View" a "Projection") použité při zobrazování, do vlastního zobrazování nebudete muset vůbec zasahovat.

3D Lissajous

Základ

Jako základ nejlépe poslouží projekt 086shaders z repository grcis (GIT). Je připravena aplikace, která umí 3D scénu načíst ze souboru (Wavefront OBJ) nebo ji vygenerovat algoritmem (implicitní SFC křivka Matúše Goliaše). Scéna se poté zobrazí pomocí GPU, můžete zapnout stínování, pokud Vaše data budou obsahovat normálové vektory..
Po zapnutí přepínače Animation se uplatní kód obsažený v třídě AnimatedCamera (viz zdrojový soubor Camera.cs). Animační křivka může definovat pohyb kamery v čase, změnu její orientace (směru a otočení pohledu) nebo obojí. Uživatel používá k ovládání animované kamery tlačítka: Load cam (volitelné definování kamery/animačního scriptu z externího textového souboru), Start/Stop (spuštění/pozastavení animace), Reset cam (uvedení kamery do počátečního stavu).
Při vypnutém přepínači Animation funguje interaktivní systém Trackball jako dřív, aktivní je pouze tlačítko Reset cam.

Teorie

Všechny potřebné detaily byste měli nalézt v přednášce Mathematics for 3D graphics, v části a maticových transformacích (viz schéma souřadných systémů na slajdu č. 8) a v partiích věnovaných kvaternionům a animačním křivkám.
Budete muset počítat transformační matici "Model-View" která umisťuje kameru ve světových souřadnicích (ve skutečnosti transformuje svět do polohy pohodlné pro další zpracování = pozorovatel je v počátku souřadnic a dívá se proti směru osy z) a projekční matici "Projection", která definuje parametry projekce, v našem případě středové projekce. V počítačovém vidění se první transformaci někdy říká "Extrinsic camera parameters" a té druhé "Intrinsic parameters" (protože definuje vlastní parametry optického systému).
Doporučení: zvolit si pevné parametry projekce ("Projection") a v průběhu animace je již neměnit. Rozumné je použít zorný úhel maximálně 80°.
Pohyb kamery: je nutné pohybovat kamerou po nějaké hladké animační křivce (definované goniometricky nebo nejlépe obecně pomocí free-form interpolační křivky, třeba Catmull-Rom, viz slajd č. 42).
Orientace kamery: i otáčení směru pohledu se musí dělat co nejvíce spojitě, například pomocí kvaternionové interpolace (slajdy č. 52-53) nebo za pomoci hladce přesouvaného cíle pohledu (viz funkce Matrix4.LookAt()).
Parametrizace animační křivky: pokud budete chtít implementovat nějaké sofistikovanější schéma, zkuste si najít hesla jako např. Centripetal model nebo článek E. T. Y. Lee: Choosing nodes in parametric curve interpolation.

Technické detaily

Interface definující API pro dynamicky se měnící kameru: IDynamicCamera. Doporučujeme odvozovat Vaši kameru od třídy DefaultDynamicCamera, ve které je již většina přístupových metod rozumně definována a Vám zbyde implementovat pouze tu hlavní část – vlastní výpočet transformačních matic v závislosti na čase.
Implementace Vaší kamery je ve zdrojovém souboru Camera.cs, třída se jmenuje AnimatedCamera. Její implicitní chování – oblétání středu scény po křivce podobné kružnici, směr pohledu je zafixován do středu scény. Následující sekce obsahuje popis nejdůležitějších vlastností a funkcí API, které musíte implementovat nebo jim aspoň rozumět. Úmyslně vynecháváme funkce, které se používají při interaktivní práci (Trackball) a u skriptované kamery nejsou potřeba.

Výtah z IDynamicCamera API

  • Update() – volá se na začátku animačního režimu, máte možnost přečíst si parametry animace z formulářového pole Param: nebo z externího textového souboru (formát je úplně ve Vaší moci)
  • double Time – aktuálně nastavený čas v sekundách
  • double MinTime – začátek časového intervalu animace
  • double MaxTime – konec časového intervalu animace (po dosažení tohoto času se skočí zpět na začátek – animace je automaticky zacyklena)
  • Reset() – [re-]inicializace animace na začátek
  • GLsetupViewport() – volá se při každé změně geometrie okna (událost "Resize"). Měli byste minimálně přepočítat projekční matici reflektující nový poměr šířky a výšky okna
  • Matrix4 ModelView – vrátí aktuální Model-View transformační matici (zde je koncentrovaná hlavní funkce animované kamery, tato matice odráží změnu polohy a orientace kamery v čase)
  • Matrix4 ModelViewInv – pokud můžete, vraťte zde inverzní matici (aby se nemusela invertovat). Implicitní implementace invertuje ModelView
  • Matrix4 Projection – vrátí aktuální projekční matici
  • Vector3 Eye – vrátí aktuální polohu kamery (oka) ve světových souřadnicích

Zbytek IDynamicCamera API si můžete přečíst v souboru Trackball.cs.

Příklad externího scriptu

Jedna řádka textového souboru (čtená např. funkcí TextReader.ReadLine()) = jeden klíčový snímek.
Parametry ve formátu Util.ParseKeyValueList() s tím, že na řádce je povinný jen časový údaj. Parametry:

  • t = <double> – čas klíčového snímku v sekundách
  • pos = [<double>;<double>;<double>] – poloha kamery [x;y;z]
  • lookat = [<double>;<double>;<double>] – poloha bodu, který sleduji [x;y;z]
  • up = [<double>;<double>;<double>] – "up" vektor [x;y;z]

Nezadané hodnoty se kopírují z předchozího klíčového snímku. Takže například řádka pouze s časovým údajem znamená konstantní segment od minulého klíčového snímku..

Termín

Odevzdat do: 28. 2. 2023

Body

7 bodů: hladký pohyb kamery definovaný implicitně v programu, hladká interpolace trajektorie
až 4 bodů: hladká interpolace orientace kamery (kvaterniony nebo netriviálně se pohybující sledovací bod)
až 6 bodů: skripovaná animace (externě definovaný animační skript dle vlastního formátu)
až 5 bodů: bonus za zajímavý/pěkný skript

Projekt

Visual Studio projekt: 086shader

Zdrojový soubor

Modifikujte a odevzdejte soubor: Camera.cs
Do funkce InitParams() napište své jméno!


Copyright (C) 2018-2022 J.Pelikán, last change: 2022-12-08 07:31:44 +0100 (Thu, 08 Dec 2022)