Úloha 095: Konstrukce 3D scény - SFC

Úkolem je zkonstruovat 3D křivku, která "vyplňuje prostor", je však ji třeba sestavit jako povrchový model složený z trojúhelníků. Konstrukce musí být algoritmická, tj. "geometrie" (polohy vrcholů v prostoru) i "topologie" (napojení vrcholů do trojúhelníků) musí být výsledkem práce Vašeho algoritmu. Požadována je korektní reprezentace tělesa v paměti, kterou lze pro kontrolu nakreslit, vystínovat a uložit případně na disk v PLY formátu.

3D Hilbert
© Michael Bader

Základ

Jako základ slouží projekt 086shader 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í v mnoha různých módech (čárová kresba, viditelnost bez stínování nebo i s ním, povrchová textura..). Výslednou 3D scénu půjde uložit na disk (Stanford PLY).
Pro konstrukci Vašeho tělesa budete 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(). Nezapomeňte pro stínování nastavit normálové vektory ve vrcholech sítě!
Respektujte transformační matici m, kterou musíte transformovat všechny vkládané vrcholy i jejich normálové vrcholy.

Alternativní (jednodušší) projekt

Při řešení můžete použít též projekt 038 Trackball, kde je implementováno jen vykreslování pomocí OpenGL s interaktivním otáčením 3D scénou, bez pokročilejšího stínování. I do tohoto projektu můžete vložit beze změny Váš zdrojový soubor Construction.cs.

Náměty

Můžete čerpat z následujících zdrojů: Space-Filling Curves in 3D (přednáška Michaela Badera) nebo Stránka s odkazy Aubrey Jaffer (několik odkazů na články).
Google search (3D SFC images).

Technické detaily

Dostanete objekt 3D scény SceneBrep, do kterého budete křivku (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í).

Křivku byste měli reprezentovat jako "potrubí", aby se dala pěkně zobrazit a vystínovat. Klouby (kolena) spojující jednotlivé válcové úseky implementujte jako části rotačního tělesa toroid. Je třeba použít vhodnou jemnost reprezentace válcových i toroidálních úseků, pro složitější křivku můžete zvolit jednodušší reprezentaci jednotlivých komponent a naopak.. Naprogramujte si na jednotlivé komponenty procedury!

Je možná i alternativa - použití pravoúhlých tvarů (ne oblých). Tj. potrubí se čtvercovým / obdílníkovým průřezem. V takovém případě byste neměli sdílet vrcholy sousedních stěn, ale naopak je duplikovat, aby každá stěna měla svoji vlastní normálu.

Pro jednodušší ladění máte možnost zadat iniciální hodnotu textového parametru param formuláře - k tomu slouží funkce InitParams() (jako obvykle zde vyplňte i své jméno do parametru name).
Nakonec odevzdejte zdrojový soubor s vhodným nastavením řetězce param!

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())
  • [volitelné] texturové souřadnice ve vrcholech můžete nastavit metodou SceneBrep.SetTxtCoord(). 2D texturové souřadnice mají typ Vector2 .. [s,t], složky jsou v rozsahu 0.01.0
  • [volitelné] barvy ve vrcholech můžete nastavit metodou SceneBrep.SetColor(). Barvy jsou trojice Vector3 .. [R,G,B] s rozsahem jednotlivých složek 0.01.0
  • 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())
  • pro efektivnější přidávání rozsáhlejších částí scény používejte funkci SceneBrep.Reserve(int)

Termín

Odevzdat do: 8. 1. 2017

Body

Základ: 10 bodů (jedna varianta křivky, bez parametrizace),
dalších až 6 bodů: bonus za parametrizaci, varianty a pěkný vzhled při stínování

Projekt

Visual Studio projekt: 086shader nebo 038trackball (modifikovaný zdrojový soubor lze vložit beze změny do obou z nich)

Zdrojový soubor

Modifikujte a odevzdejte soubor: Construction.cs
Do komentáře na první řádce napište své jméno!
V posledním parametru funkce InitParams() rovněž vraťte své celé jméno!


Copyright (C) 2010-2016 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)