Úkolem je zkonstruovat 3D reprezentaci zobecněné Lissajousovy křivky. Křivka je definována jednoduchými vzorci v parametrickém tvaru a Vaším úkolem bude "obalit" ji trojúhelníkovou sítí (triangle-mesh). Dostanete k dispozici prostředí s implementovaným povrchovým modelem scény (B-rep) obohaceném o "Corner-table". Výsledkem je korektní reprezentace 3D scény v paměti, kterou lze v dané aplikaci nakreslit a uložit na disk v některém z 3D formátů.
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 (zde se uplatní Váš kód). Scéna se poté zobrazí pomocí GPU, můžete
zapnout stínování, pokud Vaše data budou obsahovat normálové vektory. Výsledný obrázek (bitmapu) resp. 3D scénu
půjde uložit na disk (PNG formát resp Wavefront OBJ).
Pro konstrukci Vaší scény budete muset modifikovat předem založenou
třídu Construction nacházející se ve zdrojovém souboru
Construction.cs. Konstrukční metoda se jmenuje Construction.AddMesh().
Stínování je nepovinné, pokud ho budete chtít využít, nezapomeňte nastavit normálové vektory ve vrcholech sítě!
Respektujte transformační matici m, kterou musíte transformovat
všechny vkládané vrcholy (Vector3.TransformPosition()) i jejich normálové vrcholy
(Vector3.TransformVector()).
Je potřeba, abyste ve svém řešení křivku "obalili" trojúhelníkovou sítí,
aby byla pěkně vidět. Ideálním řešením je použít válcovou trubku s kruhovým nebo
podobným průřezem, to už necháme na Vás. Hladký vzhled trubky můžete zvýraznit
stínováním, k tomu bude potřeba do vrcholů zadat též normálové vektory.
Lissajousova křivka je definována parametricky pomocí goniometrických funkcí a je možné
snadno spočítat její tečný vektor (derivace definiční funkce), tedy i rovinu kolmou
na křivku v daném bodě. V této kolmé rovině byste měli spočítat několik vrcholů tvořících
"obal" křivky. Vrcholy ze sousedních průřezů pak bude potřeba na sebe správně napojit.
Stránka Wikipedie zabývající se Lissajousovou křivkou.
3D zobecnění je velmi jednoduché, prostě přidáte další složku souřadnic Z.
Doporučujeme upravit si vyjádření křivky tak, aby obsahovalo pouze funkce cosinus
(s příslušným fázovým posuvem).
Dalším rozšířením by mohlo být přidání dalšího členu (další cosinus s rozdílnou
frekvencí i fázovým posuvem) do všech rovnic, jako je to například u křivky
Rose.
Výpočet definičního intervalu: Lissajousova (i "Rose") křivka
by měla být cyklická, tj. parametr t by měl probíhat od nuly po vhodný
násobek PI. Není úplně jednoduché určit tento interval, ale měli byste se
o to pokusit. Tip: zkuste pracovat s frekvenčními koeficienty jako s racionálními čísly.
Dostanete objekt 3D scény SceneBrep, do kterého budete těleso přidávat, dále instanční matici transformace Matrix4 a textový parametr pro volbu varianty konstrukce (např. typ tělesa, pokud jich implementujete více). Nezapomeňte, že Vaše funkce Construction.AddMesh() může být vyvolána opakovaně. V žádném případě neinicializujte objekt scény, při každém volání prostě přidejte novou instanci Vašeho tělesa (se zadanou instanční transformační maticí).
Pro jednodušší ladění máte možnost zadat iniciální hodnotu textového parametru param formuláře - k tomu slouží funkce InitParams().
Po vytvoření 1 až 8 instancí Vašeho tělesa se spustí procedura CheckCornerTable(), která prověří topologii vytvořeného modelu. Pokud se v hlášení o počtu chyb objeví nenulové číslo, měli byste si na textové konzoli ("Output" ve Visual Studiu) zkontrolovat, které nekonzistence byly nalezeny.
Odevzdat do: 31. 8. 2021
Základ: 6 bodů (implementace obecné Lissajousovy křivky obalené aspoň nějakým triviálním způsobem trojúhelníky).
Bonus až 4 body za pěkné obalení křivky "trubkou" a vybarvení.
Bonus až 3 body za automatický výpočet definičního oboru křivky.
Bonus až 2 body za normálové vektory (projeví se při zapnutém stínování).
Bonus až 3 body za další rozšíření (např. "Rose" křivka).
Visual Studio projekt: 086shader
Modifikujte a odevzdejte soubor: Construction.cs
Do funkce InitParams() napište své jméno!
Copyright (C) 2010-2021 J.Pelikán, last change: 2021-06-07 13:52:48 +0200 (Mon, 07 Jun 2021)