Úloha 057: Konstrukce 3D povrchové scény

Úkolem je zkonstruovat nějaké zajímavé těleso pomocí trojúhelníkové sítě (triangle-mesh) v prostředí obsahujícím implementaci "Corner-table". Konstrukce by měla být algoritmická, tj. "geometrie" (polohy vrcholů v prostoru) i "topologie" (napojení vrcholů do trojúhelníčků) by měly být dány algoritmem. Výsledkem je korektní reprezentace tělesa v paměti, kterou lze pro kontrolu nakreslit a uložit na disk v OBJ formátu.

Základ

Jako základ může posloužit projekt 057scene 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í jednoduchou čárovou kresbou bez viditelnosti ("Wireframe"). Výsledný obrázek (bitmapu) resp. 3D scénu půjde uložit na disk (PNG formát resp Wavefront OBJ).
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 hladké plochy nastavit normálové vektory ve vrcholech sítě!

Alternativní projekt (OpenGL)

Při řešení můžete použít též výsledky projektu 038 Trackball, kde je implementováno vykreslování pomocí OpenTK (OpenGL), interaktivní otáčení 3D scénou, vytváření více instancí vaší scény, apod. I do tohoto projektu můžete vložit beze změny váš zdrojový soubor Construction.cs.

Náměty

Platónská tělesa (stěny složené pouze z trojúhelníků, tj. musíte je triangulovat), graf funkce dvou proměnných, apod.
Inspiraci můžete najít v pěkné knížce Atlas geometrie, např. 3.8 až 3.10, 6.

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 parametr pro volbu varianty konstrukce (např. typ tělesa, pokud jich implementujete více).

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

Bonus

Body navíc je možné získat za implementaci funkce, která testuje konzistenci "Corner-table" použité v SceneBrep. Hlavička funkce je též předpřipravena v zdrojovém souboru Construction.cs (funkce SceneBrep.CheckCornerTable()), pokud budete chtít ji implementovat, udělejte to a nezapomeňte mne na to upozornit v doprovodném mailu.

Termín

Odevzdat do: 18. 1. 2015

Body

Základ: 8 bodů (jednoduché těleso),
4 body (základní kontrola "Corner-table")
dalších až 8 bodů bonus za zajímavá tělesa, pokročilejší kontrolu..

Projekt

Visual Studio 2010 projekt: 038trackball nebo 057scene

Zdrojový soubor

Modifikujte a odevzdejte soubor: Construction.cs
Do komentáře na první řádce napište své jméno!
Nezapomeňte upozornit, zda a jak kontrolujete konzistenci scény (CheckCornerTable).


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