3D-s számítógépes geometria és alakzatrekonstrukció Tesztkörnyezet III http://cg.iit.bme.hu/portal/node/312 https://portal.vik.bme.hu/kepzes/targyak/viiima01 Dr. Várady Tamás, Dr. Salvi Péter BME, Villamosmérnöki és Informatikai Kar Irányítástechnika és Informatika Tanszék
Tartalom Átlaggörbület-approximáció Mesh-navigáció [OpenMesh] Dialógusablakok felépítése [Qt] Layoutok Színezés [OpenGL] Jobb normális- és görbületbecslés Fényvonalak Fényvonal-textúra kiszámítása Resource-ok használata [Qt] Textúrák használata [OpenGL] Környezeti textúrák
Harmadik fázis Átlaggörbület Színkódolás [kék zöld piros] Szélsőértékek meghatározása Fényvonalak [bővebben később] Tartomány szélének levágása Explicit megadás Dinamikus textúra Kimutat apró egyenetlenségeket Ehhez: Qt [menü, dialóguskészítés] OpenGL [színezés, textúra] OpenMesh [háromszögháló bejárás]
Átlaggörbület (ismétlés) Becslés háromszöglegyező alapján 1 βi e i i 4 H p = 1 A p 3 Feladatok: A(p) kiszámítása (és eltárolása) βi szögek kiszámítása H(p) eltárolása
Háromszögterületek MyViewer.h: MyViewer.cpp:
MyViewer.cpp Átlaggörbület-számítás: 1 βi e i i 4 H p = 1 A p 3 calc_dihedral_angle: előjeles, szélén 0
A program szervezése MyViewer osztály Görbületszámítás double mean_min, mean_max, cutoff_ratio getmeanmin(), setmeanmin(double) stb. enum class Visualization { PLAIN, MEAN } updatemeancurvature(bool update_min_max) Min/max update nem kell pl. fairing után Színezés meanmapcolor(double) GUI Menü, dialógusablakok Billentyűleütésre (P/M) coloring változtatása
MyViewer.cpp
MyViewer.cpp
GUI MyViewer.cpp: MyWindow.cpp:
Kitérő Layoutok Widgetek elhelyezése QWidget::setLayout [a legkülső layout] QLayout::addWidget, QLayout::addLayout QBoxLayout, QGridLayout, QFormLayout Jó alapméretek, átméretezés kezelése Saját widgetekhez sizehint()
setcutoff()
setrange()
Csúcs-normálisok becslése Emlékeztető: Lap-normálisok súlyozott átlaga Súlyozás: egyenletes / területarányos Ötlet: működjön jól gömbre! Legyen és Tegyük fel, hogy a pontok egy gömbön vannak Normális irány: a gömb középpontjából p-be A középpont pozícióvektora (negálva) Hol a középpont? Az élfelező merőleges síkok metszetében!
Csúcs-normálisok becslése Az élfelező síkok: azaz Nézzük három szomszéd pontra (3 egyenlet) Cramer-szabály segítségével a középpont: ahol D az együttható-mátrix determinánsa Csak az irány kell!
Csúcs-normálisok becslése
Jobb görbület-becslés Főgörbületek ( ): A másodrendű főmennyiségek mátrixának (II) sajátértékei Tudjuk: Deriválás után: azaz stb. Tehát II s megadja a normális s irány szerinti iránymenti deriváltját a rendszerben Nevezzük ezt a rendszert (u,v)-nek, tehát:
Jobb görbület-becslés Ötlet: LSQ fit Kapunk egy lap-görbületet Át akarjuk váltani csúcs-görbületté A csúcs lokális koordinátarendszerét bele kell forgatni ugyanebbe a síkba Forgatás a csúcshoz tartozó élek keresztszorzatán
Jobb görbület-becslés Legyen a p csúcshoz tartozó (átforgatott) lokális koordinátarendszer Az ehhez a rendszerhez tartozó L,M,N: A csúcsokban súlyozzuk az egyes lapokból származó L,M,N vektorokat Súlyozás a háromszög csúcshoz közel eső területe szerint (vö. Voronoi) Implementáció: ld. forrás :)
Tükröződési vonalak Struktúrált fények visszaverődései Intuitív, G1/G2 hiba Folytonos, sima: G2 Folytonos, tört: G1
Fényvonalak (Isophotes) Egyszerűbben számolható Referencia pontból sugarak Beesési szög a normálvektorral: p ref p α = cos n p ref p 1 Megjelenítés: piros/fehér 5 fokonként Probléma: Referencia pont változik textúra változik Új textúrát generálni lassú
OpenGL trükk Környezeti térkép (environment map) Dinamikus textúra A felületi pont textúra pont hozzárendelés a nézőponttól és a normálvektortól függ Ötlet: referenciapont = nézőpont OpenGL gömb leképezés
Gömb leképezés (x,y,z) a visszaverődés iránya [szem-koordinátarendszerben] Ehhez rendelt textúra ([0,1]x[0,1]-ben): s, t = x 1 y 1 2 2 2,, ahol m = 2 x y 1 z m 2 m 2 Lekódolja az összes irányt 3 koordináta, de egységvektor két szabadságfok Ez a kódolás látványos (projekció) Könnyen rátehető panoráma is
Fényvonalak kiszámítása Feladat: (s,t) textúrakoordináta α szög (x,y,z) egységvektor, tehát 8 x 2 y 2 2 2 z = 1 = 8 s s t t 3 2 m cos 1 z α= 2 és, mivel z épp a referenciairány Ez alapján kiszínezhető a textúra Képfájlként fogjuk beolvasni
A Qt resource rendszer Fájlok tárolása a futtatható állományban Tipikusan képek, szövegek (HTML stb.) XML-jellegű leíró fájl (.qrc) Projekt fájl: Ebből adat-cpp fájl generálódik Formátum: RESOURCES = sample-framework.qrc Qt-s fájlműveleteknél :/ elérési út
OpenGL textúra készítés Textúra ID Paraméterek (gltexparameter[if]v?) Külső pontra mit csináljon (pl. csempézés) Minőségjavító min/mag filterek stb. Környezeti beállítások (gltexenv[if]v?) Generálás (n db.): glgentextures(n, addr) Hozzárendelés: glbindtexture(type, id) Törlés (n db.): gldeletetextures(n, addr) Textúra, árnyalás és anyag (szín) kapcsolata Textúra készítese glteximage2d(...sok paraméter...)
OpenGL textúra koordináták glenable(gl_texture_2d) Megadható pontonként gltexcoord[1234][dfis]v? Az aktuális (bind-olt) textúrára vonatkozik Generált koordináták gltexgen[dfi]v? : generálás paraméterei GL_TEXTURE_GEN_MODE : mód beállítása GL_OBJECT_LINEAR GL_EYE_LINEAR GL_SPHERE_MAP GL_OBJECT_PLANE / GL_EYE_PLANE : sík megadása glenable(gl_texture_gen_s) glenable(gl_texture_gen_t)
Textúra inicializálás MyViewer.cpp: GL_LINEAR: (lineáris interpoláció) Távoli felületek [MIN] Közeli felületek [MAG] GL_CLAMP_TO_EDGE: Kívül eső pontokat a szélére húzza
Textúra a háromszöghálón