3D-s számítógépes geometria és alakzatrekonstrukció

Hasonló dokumentumok
3D-s számítógépes geometria és alakzatrekonstrukció

3D-s számítógépes geometria és alakzatrekonstrukció

3D-s számítógépes geometria és alakzatrekonstrukció

3D-s számítógépes geometria és alakzatrekonstrukció

Árnyalás, env mapping. Szécsi László 3D Grafikus Rendszerek 3. labor

3D számítógépes geometria és alakzatrekonstrukció

Grafikus Qt programok írása segédeszközök nélkül

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

3D számítógépes geometria és alakzatrekonstrukció

3D - geometriai modellezés, alakzatrekonstrukció, nyomtatás

Elemi alkalmazások fejlesztése III.

3D - geometriai modellezés, alakzatrekonstrukció, nyomtatás

BME MOGI Gépészeti informatika 6.

3D-s számítógépes geometria

Elemi alkalmazások fejlesztése III. A Qt assistant elindítása. Ajánlott ir odalom. A Qt assistant nyitó ablaka

3D - geometriai modellezés, alakzatrekonstrukció, nyomtatás

3D Számítógépes Geometria II.

3D-s számítógépes geometria és alakzatrekonstrukció

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

A jobboldalon a pnlright egy Stacked Widget Állítsuk be az első lapot és nevezzük el pnldraw-ra:

Számítógépes Grafika mintafeladatok

Dinamikus felületű alkalmazások. Stílusok, időzítő, képek

Feladatok. Tervek alapján látvány terv készítése. Irodai munka Test modellezés. Létező objektum számítógépes modelljének elkészítése

Elemi alkalmazások fejlesztése III.

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

3D - geometriai modellezés, alakzatrekonstrukció, nyomtatás

Egészítsük ki a Drupal-t. Drupal modul fejlesztés

Elemi alkalmazások fejlesztése III.

3D számítógépes geometria és alakzatrekonstrukció

BME MOGI Gépészeti informatika 15.

2D képszintézis. Szirmay-Kalos László

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Textúrák. Szécsi László

3D-s számítógépes geometria és alakzatrekonstrukció

BME MOGI Gépészeti informatika 7.

Elemi alkalmazások fejlesztése III

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

bool _freehand = false; QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató

Java Server Pages - JSP. Web Technológiák. Java Server Pages - JSP. JSP lapok életciklusa

21. évfolyam 4. szám. Fizika InfoRmatika Kémia Alapok. Kiadó. Levélcím Cluj, C. P. 1/140

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

3D Számítógépes Geometria II.

ArcGIS 8.3 segédlet 5. Dr. Iványi Péter

Számítógépes Graka - 4. Gyak

Számítógépes Grafika mintafeladatok

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Nincs szinkronizáció és kommunikáció Csővezeték alkalmazása Párhuzamosítás

Hálózati architektúrák laborgyakorlat

Számítógépes Grafika SZIE YMÉK

Pénzügyi algoritmusok

Objektumok inicializálása

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

x = cos αx sin αy y = sin αx + cos αy 2. Mi a X/Y/Z tengely körüli forgatás transzformációs mátrixa 3D-ben?

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Eseményvezérelt alkalmazások fejlesztése I 3. előadás. Dinamikus felületű alkalmazások. Giachetta Roberto

Bevezetés a programozásba. 8. Előadás: Függvények 2.

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

500. CC Megoldó Alfréd CC 500.

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

QLabel *label = new Qlabel("Hello Qt!",0);

C++ Standard Template Library (STL)

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Robotika. Kinematika. Magyar Attila

Fejlett programozási nyelvek C++ Iterátorok

Bevezetés a programozásba Előadás: A const

Tisztelt Felhasználó!

QGIS. Tematikus szemi-webinárium Térinformatika. Móricz Norbert. Nemzeti Agrárkutatási és Innovációs Központ Erdészeti Tudományos Intézet (NAIK ERTI)

Raszter georeferálás QGIS-ben Összeállította: dr. Siki Zoltán verzióra aktualizálta: Jáky András

Elemi alkalmazások fejlesztése III

Bevezetés a programozásba. 11. Előadás: Esettanulmány

1. Alapok. Programozás II

OpenGL Compute Shader-ek. Valasek Gábor

Koordináta-geometria feladatgyűjtemény

QGIS Gyakorló. 1. kép: Koordináta levétel plugin bekapcsolása.

Mintavételes szabályozás mikrovezérlő segítségével

Informatika terméktervezőknek

Az ErdaGIS térinformatikai keretrendszer

Feladat. Tervezés és implementálás

Hajder Levente 2017/2018. II. félév

Tartalom. Tartalom. Anyagok Fényforrás modellek. Hajder Levente Fényvisszaverési modellek. Színmodellek. 2017/2018. II.

Algoritmizálás + kódolás C++ nyelven és Pascalban

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

3. Gyors útmutató 4. Garanciakártya

Realisztikus színtér 1 / 59

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés a C++ programozási nyelvbe

Hálózat hidraulikai modell integrálása a Soproni Vízmű Zrt. térinformatikai rendszerébe

Digitális technika (VIMIAA02) Laboratórium 1

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 3/3

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Digitális technika (VIMIAA02) Laboratórium 1

1. fejezet Bevezetés a web programozásába (Balássy György munkája) Az internet működése... 11

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

A Java nyelv. Dialógus ablakok. Elek Tibor

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Véletlen szám generálás Labirintus felépítése 1x1-es felbontástól a teljes méretig

Átírás:

3D-s számítógépes geometria és alakzatrekonstrukció 3c. Tesztkörnyezet III http://cg.iit.bme.hu/portal/node/312 https://portal.vik.bme.hu/kepzes/targyak/viiima01 Dr. Várady Tamás, 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] 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

Figyelem! A kódrészletek nem pontosak/teljesek Csak a lényeges részeket mutatják Gyakran kimaradnak... Scope-operátorok Deklarációk #include utasítások Stb. Teljes verzió A honlapon levő zip fájlokban Érdemes óra után részletesen átnézni

Háromszögterületek MyViewer.h: struct MyTraits : public OpenMesh::DefaultTraits { VertexTraits { double area; // total area of the surrounding triangles double mean; // approximated mean curvature ; FaceTraits { double area; ; ; typedef OpenMesh::TriMesh_ArrayKernelT<MyTraits> MyMesh; MyViewer.cpp: for(constfaceiter i = mesh.faces_begin(), ie = mesh.faces_end(); i!= ie; ++i) { HalfedgeHandle h1 = mesh.halfedge_handle(*i); HalfedgeHandle h2 = mesh.next_halfedge_handle(h1); mesh.data(*i).area = (halfedgevector(h1) % halfedgevector(h2)).norm() / 2; for(vertexiter i = mesh.vertices_begin(), ie = mesh.vertices_end(); i!= ie; ++i) { mesh.data(*i).area = 0; mesh.data(*i).mean = 0; for(constvertexfaceiter j(mesh, *i); j.is_valid(); ++j) mesh.data(*i).area += mesh.data(*j).area;

MyViewer.cpp Segédfüggvény: Vector MyViewer::halfedgeVector(HalfedgeHandle const &h) const { return mesh.point(mesh.to_vertex_handle(h)) mesh.point(mesh.from_vertex_handle(h)); Átlaggörbület-számítás: for(vertexiter i = mesh.vertices_begin(), ie = mesh.vertices_end(); i!= ie; ++i) { for(constvertexedgeiter j(mesh, *i); j.is_valid(); ++j) { double angle; HalfedgeHandle h1 = mesh.halfedge_handle(*j, 0); HalfedgeHandle h2 = mesh.halfedge_handle(*j, 1); i i Vector v = halfedgevector(h1); 1 β e i 4 H p = 1 mesh.is_boundary(h2)) A p 3 if(mesh.is_boundary(h1) angle = 0.0; else { Vector n1 = mesh.normal(mesh.face_handle(h1)); Vector n2 = mesh.normal(mesh.face_handle(h2)); angle = acos(std::min(std::max(n1 n2, -1.0f), 1.0f)); angle *= ((n1 % n2) v) >= 0.0? 1.0 : -1.0; mesh.data(*i).mean += angle * v.norm(); mesh.data(*i).mean *= 3.0 / 4.0 / mesh.data(*i).area;

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 {COLOR_PLAIN, COLOR_MEAN coloring updatemeancurvature(bool update_min_max) Min/max update nem kell pl. fairing után Színezés meanmapcolor(double, double *) GUI Menü, dialógusablakok Billentyűleütésre (P/M) coloring változtatása

MyViewer.cpp void MyViewer::updateMeanCurvature(bool update_min_max) {... // Mean curvature computation if(update_min_max) updatemeanminmax(); void MyViewer::updateMeanMinMax() { size_t n = mesh.n_vertices(); if(n == 0) return; std::vector<double> mean; mean.reserve(n); for(vertexiter i = mesh.vertices_begin(), ie = mesh.vertices_end(); i!= ie; ++i) mean.push_back(mesh.data(*i).mean); std::sort(mean.begin(), mean.end()); size_t k = (double)n * cutoff_ratio; mean_min = std::min(mean[k-1], 0.0); mean_max = std::max(mean[n-k], 0.0);

MyViewer.cpp void MyViewer::meanMapColor(double d, double *color) const { if(d <= mean_min) { color[0] = 0.0; color[1] = 0.0; color[2] = 1.0; else if(d >= mean_max) { color[0] = 1.0; color[1] = 0.0; color[2] = 0.0; else if(d < 0) { double alpha = d / mean_min; color[0] = 0.0; color[1] = 1.0 - alpha; color[2] = alpha; else { double alpha = d / mean_max; color[0] = alpha; color[1] = 1.0 - alpha; color[2] = 0; void MyViewer::draw() {... std::vector<double> color(3, 1.0); for(constfaceiter i = mesh.faces_begin(), ie = mesh.faces_end(); i!= ie; ++i) { glbegin(gl_polygon); for(constfacevertexiter j(mesh, *i); j.is_valid(); ++j) { if(coloring == COLOR_MEAN) { meanmapcolor(mesh.data(*j).mean, &color[0]); glcolor3dv(&color[0]); glnormal3fv(mesh.normal(*j).data()); glvertex3fv(mesh.point(*j).data()); glend();...

GUI MyViewer.cpp: void MyViewer::keyPressEvent(QKeyEvent *e) {... case Qt::Key_P: coloring = COLOR_PLAIN; updategl(); break; case Qt::Key_M: coloring = COLOR_MEAN; updategl(); break;... MyWindow.cpp: MyWindow::MyWindow(QApplication *parent) : QMainWindow(), parent(parent) {... QAction *cutoffaction = new QAction(tr("Set &cutoff ratio"), this); cutoffaction->setstatustip(tr("set mean map cutoff ratio")); connect(cutoffaction, SIGNAL(triggered()), this, SLOT(setCutoff())); QAction *rangeaction = new QAction(tr("Set &range"), this); rangeaction->setstatustip(tr("set mean map range")); connect(rangeaction, SIGNAL(triggered()), this, SLOT(setRange())); QMenu *vismenu = menubar()->addmenu(tr("&visualization")); vismenu->addaction(cutoffaction); vismenu->addaction(rangeaction);

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() QDialog *dlg = new QDialog(this); QHBoxLayout *hb1 = new QHBoxLayout, *hb2 = new QHBoxLayout; QVBoxLayout *vb = new QVBoxLayout; QLabel *text = new QLabel(tr("Cutoff ratio:")); QDoubleSpinBox *sb = new QDoubleSpinBox; QPushButton *cancel = new QPushButton(tr("Cancel")); QPushButton *ok = new QPushButton(tr("Ok")); sb->setdecimals(3); sb->setrange(0.001, 0.5); sb->setsinglestep(0.01); sb->setvalue(viewer->getcutoffratio()); connect(cancel, SIGNAL(pressed()), dlg, SLOT(reject())); connect(ok, SIGNAL(pressed()), dlg, SLOT(accept())); ok->setdefault(true); hb1->addwidget(text); hb1->addwidget(sb); hb2->addwidget(cancel); hb2->addwidget(ok); vb->addlayout(hb1); vb->addlayout(hb2); dlg->setwindowtitle(tr("set ratio")); dlg->setlayout(vb); if(dlg->exec() == QDialog::Accepted) { viewer->setcutoffratio(sb->value()); viewer->updategl();

setrange() QDialog *dlg = new QDialog(this); QGridLayout *grid = new QGridLayout; QLabel *text1 = new QLabel(tr("Min:")), *text2 = new QLabel(tr("Max:")); QDoubleSpinBox *sb1 = new QDoubleSpinBox, *sb2 = new QDoubleSpinBox; QPushButton *cancel = new QPushButton(tr("Cancel")); QPushButton *ok = new QPushButton(tr("Ok")); double max = std::numeric_limits<double>::max(); sb1->setdecimals(5); sb2->setdecimals(5); sb1->setrange(-max, 0.0); sb2->setrange(0.0, max); sb1->setsinglestep(0.01); sb2->setsinglestep(0.01); sb1->setvalue(viewer->getmeanmin()); sb2->setvalue(viewer->getmeanmax()); connect(cancel, SIGNAL(pressed()), dlg, SLOT(reject())); connect(ok, SIGNAL(pressed()), dlg, SLOT(accept())); ok->setdefault(true); grid->addwidget( text1, 1, 1, Qt::AlignRight); grid->addwidget( sb1, 1, 2); grid->addwidget( text2, 2, 1, Qt::AlignRight); grid->addwidget( sb2, 2, 2); grid->addwidget(cancel, 3, 1); grid->addwidget( ok, 3, 2); dlg->setwindowtitle(tr("set range")); dlg->setlayout(grid); if(dlg->exec() == QDialog::Accepted) { viewer->setmeanmin(sb1->value()); viewer->setmeanmax(sb2->value()); viewer->updategl();

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) Ebből adat-cpp fájl generálódik Formátum: <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>isophotes.png</file> </qresource> </RCC> Projekt fájl: 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: void MyViewer::init() { gllightmodeli(gl_light_model_two_side, 1); QImage img(":/isophotes.png"); glgentextures(1, &isophote_texture); glbindtexture(gl_texture_2d, isophote_texture); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glteximage2d(gl_texture_2d, 0, GL_RGBA8, img.width(), img.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, img.converttoformat(qimage::format_argb32).bits()); 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 MyViewer.cpp: void MyViewer::draw() {... if(coloring == COLOR_PLAIN) glcolor3dv(&color[0]); else if(coloring == COLOR_ISOPHOTES) { glbindtexture(gl_texture_2d, isophote_texture); gltexenvf(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_DECAL); glenable(gl_texture_2d); gltexgeni(gl_s, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); gltexgeni(gl_t, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glenable(gl_texture_gen_s); glenable(gl_texture_gen_t); for(constfaceiter i = mesh.faces_begin(), ie = mesh.faces_end(); i!= ie; ++i) {... // Drawing the triangles if(coloring == COLOR_ISOPHOTES) { gldisable(gl_texture_gen_s); gldisable(gl_texture_gen_t); gldisable(gl_texture_2d); gltexenvf(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_MODULATE);...