Ú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.
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.
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.
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.
Zbytek IDynamicCamera API si můžete přečíst v souboru Trackball.cs.
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:
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..
Odevzdat do: 28. 2. 2023
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
Visual Studio projekt: 086shader
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)