3.1 Mesh Viewer

A hálós megjelenítő a modellnézés 167-es házi feladatából épült fel. Tartalmaz egy Mesh osztályt és az .off betöltést, amelyet a learnopengl.com oldalról szóló ASSIMP modellbetöltési oktatóanyag alapján írtak. A shadereket úgy módosították, hogy csak az ASSIMP betöltése során generált normál értékektől számított színek legyenek. Ezenkívül a fájlok beolvasása a parancssoron keresztül történik (vagy a Visual Studio projektbeállításaiban beállítva).

3.2 Hálós csatlakozási struktúra

Három fő adatszerkezetem volt a releváns adatok tárolására. Az első a Vertex objektumok vektora volt, ahol minden Vertex objektum egy csúcs pozíciókoordinátáit (vec3), normál (vec3) és négyes mátrixát (mat4) tárolja. A pozíciókoordináták kitöltése a modellbetöltésből történik, amely során az ASSIMP-t is meghívták a normálértékek automatikus generálására. A négyes mátrixok egy későbbi szakaszban jönnek létre.

A második a Gluints vektora volt, amely az egyes lapok csúcsainak indexeit tárolta. Ez is közvetlenül az .off fájlból olvasható be. Meg kell azonban jegyezni, hogy úgy tűnik, hogy az ASSIMP alapértelmezés szerint úgy rendezi át a csúcsokat, hogy az indexek listája a következő legyen: 0,1,2,3,4…}.

Az utolsó egy hash térkép (vagy unordered_map) volt, amely egy vec3 kulcsot képez le egy int vektorhoz. Ez egy adott csúcspozícióhoz tartozó szomszédos lapok indexeinek listájának tárolására szolgált. Részben azért választottam ezt a fajta leképezést, mert az ASSIMP a fent leírt viselkedés szerint a csúcsok listájában duplikált csúcsokat hoz létre. Ez lehetővé tette számomra, hogy nyomon kövessem a szomszédos lapokat minden egyedi pozíciókoordinátánál. Akkoriban úgy gondoltam, hogy ebből a hash térképből ki tudom számítani a szomszédos csúcsokat, de utólag visszagondolva valószínűleg nagyon érdemes lett volna külön leképezést készíteni ehhez.

3.2 Háló tizedelés

A fentiekhez élösszecsukást alkalmazunk az első és a második csúcsra (amelyek a felírási diagramban v0-nak és v1-nek felelnek meg). A megjelenő hibakeresési üzenetekben azt látjuk, hogy a művelet eredményeként 6 index vagy két arc törlődik. Ennek az írásnak az időpontjában csak az ismétlődő csúcsokat ellenőrzöm, így az „uszonyok” nem kerülnek eltávolításra. Azt is látjuk, hogy az új csúcs szomszédsági listája nem tartalmazza az eltávolított lapokat.

Itt a két lila lap közötti él be van csukva.

3.4 Négyzetes egyszerűsítés

A négyzetes egyszerűsítés jelenleg lépésről lépésre fut a billentyűzet segítségével. Gyanítom, hogy ha nem távolítják el a bordákat az élek összecsukásakor, az elrontja a 2. és 3. kép közötti lépést. Összességében nem vagyok teljesen biztos abban, hogy ez megfelelően működik-e.

Egy prioritási sort használtam, amely Vertex objektumpárokat tárol. Ennek fő oka az volt, hogy be tudtam állítani a rendezési függvényt, hogy kiszámítsam a hibanégyeseket minden párhoz, és a listán belül a legkisebb hiba szerint rendezhessem őket.

Van egy quadricInit() függvényem, amely kiszámítja (vagy frissíti) a négyzetes mátrixot minden csúcsra. Van egy setupQuadric() függvény is, amely az összes csúcspárt átadja a prioritási sornak. És végül a fő négyes függvény a legalacsonyabb hibapárt ugrik fel, és élösszeomlást hív rajtuk.

3.5 Progresszív hálók

Nem működik