Úloha 057: Konstrukce 3D scény - Lissajous

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

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

Reprezentace křivky

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.

Teorie

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.

Technické detaily

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.

Metody konstrukce

  • vrcholy sítě přidávejte metodou SceneBrep.AddVertex(). Nezapomeňte je předtím transformovat danou instanční maticí! (např. Vector3.TransformPosition())
  • normálové vektory nastavujte metodou SceneBrep.SetNormal(). Nezapomeňte je předtím transformovat danou instanční maticí! (např. Vector3.TransformVector())
  • trojúhelníky zakládejte metodou SceneBrep.AddTriangle(i,j,k). Použijte indexy třech již dříve založených vrcholů (návratová hodnota SceneBrep.AddVertex())

Termín

Odevzdat do: 31. 8. 2021

Body

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

Projekt

Visual Studio projekt: 086shader

Zdrojový soubor

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)