Úloha 070: Kreslení subdivision plochy

Úkolem je implementovat algoritmus vykreslování subdivision plochy používající tzv Loop schéma dělení (viz SIGGRAPH tutorial, str. 70, obrázek 4.3). Podle vstupní řídící trojúhelníkové sítě je potřeba nakreslit plochu s přesností na jeden pixel. Vlastní 3D vykreslování bude dělat OpenGL knihovna, vaším úkolem je rozložit plochu na jednotlivé body, které se potom nakreslí jednou dávkou (GL_POINTS primitivum).
Dělte trojúhelníkovou síť tak dlouho, než budou vrcholy velmi blízko u sebe, přesný systém ukončení dělení musíte vymyslet.

Loop

Kromě implementace subdivision dělení sestavte z těchto ploch nějakou zajímavou scénu, abyste demonstrovali funkčnost vaší implementace.

Implementace

Základem poslouží projekt 070subdivision z repository grcis. Je připravena aplikace, která má tyto funkce:

  • umí načíst řídící trojúhelníkovou síť z OBJ formátu (polohy vrcholů nebo i normály)
  • nebo volá metodu pro vytvoření řídící sítě Subdivision.ControlMesh()
  • ve fázi přípravy scény pro vykreslení volá metodu Subdivision.Subdivide() jejíž úkolem je spočítat povrchové body výsledné plochy. Parametr epsilon udává mezní rozměr trojúhelníka, který se už nemusí dělit.
  • pro podporu vykreslování existují metody Subdivision.VertexBufferSize() a Subdivision.FillVertexBuffer()
  • povrchové body zobrazuje dávkově pomocí OpenGL (GL_POINTS primitiva)
  • v prostoru je možné si objekt prohlížet interaktivně systémem Trackball

Termín

Odevzdat do: 28. 2. 2015

Body

Základ: 12b (základní algoritmus dělení + demo scéna)
Bonusy: animace scény v čase, počítání normálových vektorů, počítání 2D texturové souřadnice a barvení nějakou zajímavou procedurální texturou, zvlášť pěkná testovací scéna (geometrie)

Projekt

Visual Studio 2010 projekt: 070subdivision

Zdrojový soubor

Modifikujte a odevzdejte soubor: Subdivision.cs
Do komentáře na první řádce napište své jméno!
Upozorněte na rozšíření, které jste implementovali.


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