3D-s számítógépes geometria és alakzatrekonstrukció
Transcript of 3D-s számítógépes geometria és alakzatrekonstrukció
![Page 1: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/1.jpg)
Tesztkörnyezet II
3D-s számítógépes geometria és alakzatrekonstrukció
http://cg.iit.bme.hu/portal/node/312
https://portal.vik.bme.hu/kepzes/targyak/VIIIMA01
Dr. Várady Tamás, Dr. Salvi PéterBME, Villamosmérnöki és Informatikai KarIrányítástechnika és Informatika Tanszék
![Page 2: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/2.jpg)
Tartalom● Poligonhálók reprezentációja
● Fájlformátumok● Fél-él adatstruktúra
● OpenMesh könyvtár● Osztály definiálása● Iterátorok, cirkulátorok
● libQGLViewer/OpenGL● Kamera használata● Megjelenítési módok (wireframe / solid)
![Page 3: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/3.jpg)
Második fázis● Mit tud?
● Háromszöghálók beolvasása– STL és PLY fájlformátum
● Megjelenítés– W: wireframe ON/OFF– S: solid ON/OFF
● Ehhez:● Qt [menü, fájlnyitás-dialógus]● OpenGL [megjelenítés]● OpenMesh
– Hatékony háromszögháló implementáció– Standard fájlformátumok kezelése
![Page 4: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/4.jpg)
Poligonhálók reprezentációja● Hogyan érdemes tárolni...
● ...fájlokban? [a méret a lényeg]● ...a memóriában? [a használhatóság a lényeg]
● Triviális megoldás (háromszögekre):T1Ax, T1Ay, T1Az, T1Bx, T1By, T1Bz, T1Cx, T1Cy, T1CzT2Ax, T2Ay, T2Az, T2Bx, T2By, T2Bz, T2Cx, T2Cy, T2Cz...TnAx, TnAy, TnAz, TnBx, TnBy, TnBz, TnCx, TnCy, TnCz
● Pl. STL formátum● Mi ezzel a probléma?
● Nincs topológiai információ● Ugyanaz a vertex többször szerepel
![Page 5: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/5.jpg)
Ügyesebb reprezentáció● Minden vertexet egyszer tárol● Hivatkozás indexekkel● Például (PLY formátum):
[...header...]P1x P1y P1zP2x P2y P2z...Pmx Pmy Pmz3 T1A T1B T1C3 T2A T2B T2C...3 TnA TnB TnC
● Obj, VTK formátumok hasonló elven● Fájlban tárolásra jó,de kevés topológiai információ
![Page 6: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/6.jpg)
Milyen a jó adatstruktúra?● Hatékony műveletek nagy háromszöghálókra
● Lekérdezések– Topológiai (szomszédsági információk)– Geometriai (koordináták, szögek, élhosszak)
● Átstrukturáló operációk (pl. éltörlés)● Egyéb műveletek
– Normális- és görbületbecslés– Adott sugáron belüli pontok kigyűjtése
● Univerzális● n-oldalú lapok● Külső és belső hurkok (lyukak)
![Page 7: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/7.jpg)
Fél-él adatstruktúra● Irányított élpárok, orientált felületek
● Az “anyag” a baloldalon
● Csúcs:● Egy (tetszőleges) fél-él● Koordináták stb.
● Fél-él:● Kezdőpont● Pár (“twin”, mindig létezik)● Lap (ha van)● Előző és/vagy következő fél-él
● Lap: egy fél-él minden hurokhoz
![Page 8: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/8.jpg)
Ujjgyakorlat● Hol vannak az alábbi sokszöghálóna fél-élek? (satírozás → lyuk)
![Page 9: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/9.jpg)
Ujjgyakorlat● Hol vannak az alábbi sokszöghálóna fél-élek? (satírozás → lyuk)
![Page 10: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/10.jpg)
Fejgyakorlat● Egy fél-él adatstruktúra alapján...
● Hogyan gyűjtjük össze egy csúcs körüli szomszédos csúcsokat?
● Hogyan gyűjtjük össze egy csúcs körüli szomszédos lapokat?
● Hogyan találjuk meg, és hogyanmegyünk végig a mesh határán?(ha nincsenek lyukak)
![Page 11: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/11.jpg)
Fejgyakorlat● Egy fél-él adatstruktúra alapján...
● Hogyan gyűjtjük össze egy csúcs körüli szomszédos csúcsokat?→ első csúcs: a félél párjának kezdőpontja→ köv. félél: a pár rákövetkező félélje→ köv. csúcs: az új félélből hasonlóan...
● Hogyan gyűjtjük össze egy csúcs körüli szomszédos lapokat?→ Ugyanaz, kezdőpont helyett lap
● Hogyan találjuk meg, és hogyanmegyünk végig a mesh határán?(ha nincsenek lyukak)→ első félél: ahol nincs lap→ köv. félél: a rákövetkező (!)
![Page 12: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/12.jpg)
OpenMesh● Honlap: http://www.openmesh.org/● RWTH Aachen egyetem (Leif Kobbelt)● Általános és hatékony reprezentáció
● Poligonhálók● Fél-él struktúra
● Alapvető algoritmusok● Pl. normálbecslés, decimálás, simítás
● Fontosabb fájlformátumok támogatása● STL, PLY, OBJ, IGES stb.
● Lightweight (vö. CGAL, OpenCascade)● Dokumentáció: szűkszavú, de van sok példa
![Page 13: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/13.jpg)
Az OpenMesh használata● Mesh = TriMesh/PolyMesh + Kernel + Traits● Kernel: belső tárolás (pl. ArrayKernel)● Traits: testreszabás
● Koordináták, pontok típusai● Plusz információk hozzárendelése
● Példa:
![Page 14: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/14.jpg)
Egyéb hasznos funkciók● Bejárás [bővebben később]
● Iterátorok (csúcsok, (fél)élek, lapok)● Cirkulátorok (pl. VertexFaceIter)
● Fájlbeolvasás● OpenMesh::IO::read_mesh(mesh, filename)● Fájlformátumot automatikusan felismeri
● Normálisok hozzárendelése (lap/csúcs)● request_face_normals / request_vertex_normals
– Csak lefoglalja a helyet● update_face_normals / update_vertex_normals
– Ez végzi el a tényleges számolást
![Page 15: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/15.jpg)
Fájlnyitás – GUI● MyWindow.cpp:
![Page 16: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/16.jpg)
Fájlnyitás – Geometria● MyViewer.h:
● MyViewer.cpp:
![Page 17: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/17.jpg)
Megjelenítés● Feladatok:
● Kamera ráirányítása az objektumra– Befoglaló doboz (bounding box)
● Megjelenítési módok– Tárolás, rajzolás megfelelő módosítása– Billentyű-lenyomásra váltás
● Háromszögek kirajzolása– Ehhez: iterátor (lapokon), cirkulátor (csúcsokon)– STL-jellegű– Iterátor: MyMesh::[Const]FaceIter stb.
● Range objektum: mesh.faces() / mesh.vertices() stb.
– Cirkulátor: MyMesh::[Const]FaceVertexIter stb.● Range objektum: mesh.fv_range(), mesh.vih_range() stb.
– A range-ek indexeken (...Handle) mennek végig
![Page 18: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/18.jpg)
MyViewer.cpp● Kamera-beállítás:
● Kirajzolás:
![Page 19: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/19.jpg)
Megjelenítési módok● MyViewer.h:
● MyViewer.cpp:
![Page 20: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/20.jpg)
Wireframe vs. Solid● glPolygonMode
● Csak wireframe → GL_FRONT_AND_BACK, GL_LINE● Különben → GL_FRONT_AND_BACK, GL_FILL
● Solid + wireframe problémás● Kétszer kell kirajzolni
– Egyszer a kitöltött, fehér, árnyalt háromszögeket– Egyszer csak a fekete körvonalakat
● A másodiknál ki kell kapcsolni a világítást● Meg kell akadályozni, hogy egymásba essenek
– glEnable(GL_POLYGON_OFFSET_FILL)– glPolygonOffset(1, 1)
![Page 21: 3D-s számítógépes geometria és alakzatrekonstrukció](https://reader033.fdocument.pub/reader033/viewer/2022050104/626c80c3d1b92f5af5006e49/html5/thumbnails/21.jpg)
A teljes draw()