Úloha 122: Konstrukce 3D scény z úseček

Úkolem je programem zkonstruovat 3D scénu, která je složena pouze z úseček (lomených čar). Dostanete k dispozici prostředí s implementovaným povrchovým modelem scény (B-rep) (může obsahovat i úsečky, což nyní využijeme). Aplikace umí scénu vykreslit a interaktivně s ní lze otáčet systémem Trackball.

3D Lissajous

Základ

Jako základ poslouží projekt 086shaders z repository grcis. 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 (jen pokud by byla složená z trojúhelníků – viz formát 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.lines.cs. Konstrukční metoda se jmenuje Construction.AddMesh(). Stínování není potřeba nastavovat, u úseček by bylo obtížné definovat normálové vektory!
Respektujte transformační matici m, kterou musíte transformovat všechny vkládané vrcholy (Vector3.TransformPosition()) i jejich případné normálové vrcholy (Vector3.TransformVector()).

Nápady

Můžete přemýšlet o zobecnění nápadu, který jste měli při řešení úlohy 092.
Nebo naprogramujte nějakou pěknou prostorovou křivku (ale ne prosím zobecněnou Lissajous křivku z pilotní implementace). Preferujeme pěkné křivky, které půjde modifikovat pomocí textových parametrů.
Příklad akceptovatelného zobecnění je 3D varianta tzv. křivky Rose. Pozor, musíte definici rozšířit o třetí složku souřadnic, třeba se Vám to nějak pěkně podaří.
...

Technické detaily

Ve složce projektu 086shader jsou dva soubory generující scénu: Construction.lines.cs a Construction.cs - ten druhý se týká jiné úlohy. Před řešením z projektu (v okně Solution Explorer ve Visual Studiu) odeberte Construction.cs a přidejte Construction.lines.cs.

Dostanete objekt 3D scény SceneBrep, do kterého budete úsečky/lomené čáry přidávat, dále instanční matici transformace Matrix4 a textový parametr pro volbu varianty konstrukce (např. typ křivky/scény, 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šich objektů (respektujte 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().

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())
  • barvy ve vrcholech nastavujte metodou SceneBrep.SetColor(). Rozsah jednotlivých složek RGB je [0.0, 1.0]
  • texturové souřadnice ve vrcholech nastavujte metodou SceneBrep.SetTxtCoord(). Rozsah obou složek UV je [0.0, 1.0]
  • [normálové vektory nastavujte metodou SceneBrep.SetNormal(). Nezapomeňte je předtím transformovat danou instanční maticí! (např. Vector3.TransformVector())]
  • úsečky zakládejte metodou SceneBrep.AddLine(i,j). Použijte indexy dvou již dříve založených vrcholů (návratová hodnota SceneBrep.AddVertex())

Termín

Odevzdat do: 12. 1. 2020

Body

Základ: 6 bodů (implementace nějakého vlastního nápadu nebo nějaké netriviální křivky podle literatury).
Bonus až 6 bodů za invenci, pěkné vybarvení, estetiku, apod.

Projekt

Visual Studio projekt: 086shader

Zdrojový soubor

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


Copyright (C) 2010-2020 J.Pelikán, last change: 2020-01-09 12:03:24 +0100 (Thu, 09 Jan 2020)