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



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

Elemi alkalmazások fejlesztése III.

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

Elemi alkalmazások fejlesztése III.

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

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.

Elemi alkalmazások fejlesztése III

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

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

Elemi alkalmazások fejlesztése III.

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

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

Budapest, március. ELTE Informatikai Kar

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

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

4. gyakorlat: interpolációs és approximációs görbék implementációja

Elemi alkalmazások fejlesztése III.

Számítógépes grafika

Elemi alkalmazások fejlesztése III

Programozás II gyakorlat. 6. Polimorfizmus

Programozási nyelvek JAVA EA+GY 1. gyakolat

Qt rajzolás munkafüzet. Elemi Alkalmazások fejlesztése 3.

Elemi alkalmazások fejlesztése III

Java programozási nyelv 6. rész Java a gyakorlatban

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Bevezetés a programozásba Előadás: Fordítási egység

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Programozás II gyakorlat. 4. Öröklődés

OOP és UML Áttekintés

Bevezetés a programozásba előadás: Öröklődés

Számítógépes grafika

Elemi alkalmazások fejlesztése III.

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

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál. Saját vezérlő használata tervezőben (worldclocks)

Grafikus csővezeték és az OpenGL függvénykönyvtár

Elemi alkalmazások fejlesztése III

Eseménykezelés. Aszinkron kommunikáció

Grafikus Felhasználói Felületű (GUI) program készítése a QT Creatorral, illetve a Microsoft Visual Studio-val

3. Osztályok II. Programozás II

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

Elemi alkalmazások fejlesztése IV.

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

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

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

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

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

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

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

Digitális technika VIMIAA01 9. hét

Alprogramok, paraméterátadás

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

if(_param.antialias) painter.setrenderhint(qpainter::antialiasing, true);

C++ programozási nyelv

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

Virtuális függvények (late binding)

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

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

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

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Programozás I. gyakorlat

Informatika terméktervezőknek

A C# PROGRAMOZÁSI NYELV

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

BME MOGI Gépészeti informatika 7.

Elemi alkalmazások fejlesztése IV. Adatbáziskezel alkalmazás készítése QtDesignerben. Készítette: Szabóné Nacsa Rozália

BME MOGI Gépészeti informatika 15.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

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

Mobil informatika gyakorlat. 2. óra: NFC a gyakorlatban

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

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

ISA szimulátor objektum-orientált modell (C++)

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

C programozási nyelv

C#, OOP. Osztályok tervezése C#-ban

CAN alapú járműves adatokat megjelenítő szoftver fejlesztése

Programozás C++ -ban

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

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

Programozás 6. Dr. Iványi Péter

Érintőképernyős terminálok NB sorozat

Osztály és objektum fogalma

Programozási technológia

C++ programozási nyelv

Objektumok inicializálása

Elemi alkalmazások fejlesztése I.

Mobil Informatikai Rendszerek

Programozás C++ -ban 2007/4

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

C++ programozási nyelv

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Átírás:

3D-s számítógépes geometria és alakzatrekonstrukció 3a. Tesztkörnyezet I 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 Bevezetés Qt alapismeretek Minimális program felépítése QMainWindow (menük, status bar stb.) QProgressBar libqglviewer/opengl Alapvető OpenGL rajzolás OpenGL ablak beillesztése

Áttekintés Cél: tesztkörnyezet felépítése Segítség az önálló feladatokhoz Sokrétű ismeret szükséges: C++ OpenGL Qt / libqglviewer OpenMesh Kevés elmélet, sok gyakorlat Házifeladat

A tesztkörnyezet Alapvető felhasználói eszközök Ablak- és menühasználat, progress bar stb. 3D tér forgatása, kameraállapot/kép mentése, háromszöghálós és kitöltött megjelenítés Pontok mozgatása a térben Alapvető programozói eszközök Pontok, vektorok, háromszöghálók kezelése Pontok, szakaszok és sokszögek megjelenítése Színezés, textúrázás Néhány algoritmus (pl. görbületszámítás, simítás, Bézier felület kiértékelés)

Demó Forráskód: [Mercurial repo] https://bitbucket.org/salvipeter/sample-framework/ Órai feldolgozás több fázisban A fázisok forráskódja: https://www.iit.bme.hu/~salvi/index.html Platform-független Tesztelve: Linux, Windows Linux virtuális gépen ajánlott BME Cloud: http://cloud.bme.hu/ Probléma esetén: salvi@iit.bme.hu Bugok, javítási javaslatok ugyanide

Első fázis Mit tud? Menük, status bar Négyzet kirajzolása Forgatás, nagyítás, mozgatás Help, teljes képernyő, kamera/kép mentése 'p' megnyomására progress bar teszt Ehhez: Qt QGLViewer OpenGL

Qt Bevezető Honlap: http://www.qt.io/ Trolltech Nokia Digia Qt Company Nem kereskedelmi célra ingyenes Platform-független GUI Szuper dokumentáció (http://doc.qt.io/) Saját IDE: Qt Creator De összekapcsolható a Visual Studióval is Tud Makefile-t generálni [qmake] Online help, tutorialok, demók GUI szerkesztő

Qt és C++ Saját STL könyvtár std::string QString Saját konténerek (QList, QVector, QMap stb.) Smart pointerek (weak/strong) QObject ősosztály Signal-Slot kommunikáció [ld. később] Automatikus fába rendeződés (parent-child) A szülők halálukkor megölik a gyerekeiket tr("...") a szövegek fordításához Ehhez: Q_OBJECT makró (előfeldolgozás: moc) Project fájl (.pro)

Project fájl Benne: Beállítások (pl. Release/Debug) Forrásfájlok nevei Könyvtárak neve, elérési útja Resource-ok Programozható (!) Ebből készülhet: Visual Studio projekt fájl (.vcproj) Makefile moc lefut a megfelelő fájlokra

Qt elnevezési séma Osztályok: QSomeClass ( #include <QSomeClass> ) Konstansok: QSomeClass::EnumType ValueOne, ValueTwo; Qt::EnumType Qt::ValueOne, Qt::ValueTwo; Metódusok: QSomeClass::someMethod(...) Tulajdonságok: QSomeClass::someProperty() QSomeClass::setSomeProperty(...)

A Signal-Slot kommunikáció (1) Események (event): Minden GUI mozgató rugója Felhasználói események (egér mozgatása, klikkelés, gépelés, gomb megnyomása stb.) Független események (időzítés, egy widget állapotának megváltozása stb.) Cél: Reagálás az eseményre Reakció lehet független widgetben Hagyományos megoldás: Callback függvény (paraméterátadás problémás, nem type-safe)

A Signal-Slot kommunikáció (2) Signal: Valamilyen eseményt jelez Osztály deklarálásánál signals: Jelzés az emit paranccsal Paraméterezhető Slot: Osztály deklarálásánál slots: Összekapcsoláshoz connect makró Paramétertípusoknak egyezni kell Mindkét oldalon lehet többszörös (egy signalhoz több slot, egy slothoz több signal)

Programozás Qt-val Fő ablak osztály Egy Qt osztályból származtatva Q_OBJECT Kibővítve (új signalok, slotok) Testreszabva (virtuális metódusok újraírása) Főprogram QApplication meghívása Ez felelős a GUI vezérléséért Projekt fájl készítés Fordítás

A program main.cpp: int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWindow window; window.show(); return app.exec(); } MyWindow.h: #pragma once #include <QMainWindow> class MyWindow : public QMainWindow { Q_OBJECT public: MyWindow(); ~MyWindow(); };

MyWindow.cpp #include <QMenuBar> #include <QStatusBar> #include "MyWindow.h" MyWindow::MyWindow() : QMainWindow() { setwindowtitle(tr("sample 3D Framework")); setstatusbar(new QStatusBar); ///////////////////////// // Setup actions/menus // ///////////////////////// QAction *quitaction = new QAction(tr("&Quit"), this); quitaction->setshortcut(tr("ctrl+q")); quitaction->setstatustip(tr("quit the program")); connect(quitaction, SIGNAL(triggered()), this, SLOT(close())); } QMenu *filemenu = menubar()->addmenu(tr("&file")); filemenu->addaction(quitaction); MyWindow::~MyWindow() { }

Progress Bar hozzáadása A program eddig: Progress Bar kezelés: Csak a folyamat alatt jelenik meg Három slot: start, mid, end Nem kell mindegyiket használni (pl. gomb megnyomása / számolás vége) Időt kell szakítani a grafika frissítésére (QApplication::processEvents(...))

Változások MyWindow.h:... class QApplication ; class QProgressBar ; class MyWindow : public QMainWindow { Q_OBJECT public: MyWindow(QApplication *parent);... private slots : void startcomputation (QString message); void midcomputation (int percent); void endcomputation (); private: QApplication *parent; MyViewer *viewer; QProgressBar *progress; };

Változások MyWindow.cpp: #include <QApplication> #include <QProgressBar>... MyWindow::MyWindow(QApplication *parent) : QMainWindow(), parent(parent) {... progress = new QProgressBar; progress->setminimum(0); progress->setmaximum(100); progress->hide(); statusbar()->addpermanentwidget(progress);... } void MyWindow::startComputation(QString message) { statusbar()->showmessage(message); progress->setvalue(0); progress->show(); parent->processevents(qeventloop::excludeuserinputevents); } void MyWindow::midComputation(int percent) { progress->setvalue(percent); parent->processevents(qeventloop::excludeuserinputevents); } void MyWindow::endComputation() { progress->hide(); statusbar()->clearmessage(); }

libqglviewer Honlap: http://www.libqglviewer.com/ Kiegészítő könyvtár Qt-hez OpenGL ablakkezelés Qt környezetben Vektor osztály (egyben pont osztály is) Kamera osztály (mátrixtranszformációk) Sok hasznos funkció Kameramozgatás 3D kiválasztás Teljes képernyőre váltás Stb. (ld. Help)

Származtatás a QGLViewerből MyViewer.h: #pragma once #include <QGLViewer/qglviewer.h> class MyViewer : public QGLViewer { Q_OBJECT public: MyViewer(QWidget *parent); virtual ~MyViewer(); signals: void startcomputation(qstring message); void midcomputation(int percent); void endcomputation(); protected: virtual void init(); virtual void draw(); virtual void keypressevent(qkeyevent *e); virtual QString helpstring() const; };

void init(): Virtuális függvények OpenGL beállítások inicializáláskor, pl.: gllightmodeli(gl_light_model_two_side, 1); [mindkét oldal legyen megvilágítva] void draw(): OpenGL kirajzolás void keypressevent(qkeyevent *): Eseménykezelő billentyű leütésekor QString helpstring() const: A helpben megjelenítendő szöveg

OpenGL rajzolás Nézet (camera) kezelése libqglviewer Alapból [-1,1]x[-1,1] XY síkra néz Általános struktúra: glbegin(objektum_típus); glvertex3f(float, float, float);... glend(); GL_POINTS, GL_LINES, GL_POLYGON stb....[234][sifd]v? 2/3/4: dimenzió (4: homogén koordináták) s/i/f/d: short, int, float, double v: vektor, pl. 2fv float[2]-t adunk át

MyViewer.cpp... void MyViewer::draw() { glpolygonmode(gl_front_and_back, GL_FILL); glbegin(gl_polygon); glvertex3f(-0.5, -0.5, 0.0); glvertex3f( 0.5, -0.5, 0.0); glvertex3f( 0.5, 0.5, 0.0); glvertex3f(-0.5, 0.5, 0.0); glend(); } void MyViewer::keyPressEvent(QKeyEvent *e) { if(e->modifiers() == Qt::NoModifier) switch(e->key()) { case Qt::Key_P: emit startcomputation(tr("testing progress bar...")); for(size_t i = 1; i <= 10; ++i) { usleep(300000); emit midcomputation(i * 10); } emit endcomputation(); break; default: QGLViewer::keyPressEvent(e); } else QGLViewer::keyPressEvent(e); }

Az OpenGL ablak beillesztése MyWindow.h: class MyWindow : public QMainWindow {... private:... MyViewer *viewer; }; MyWindow.cpp: MyWindow::MyWindow(QApplication *parent) : QMainWindow(), parent(parent) {... viewer = new MyViewer(this); connect(viewer, SIGNAL(startComputation(QString)), this, SLOT(startComputation(QString))); connect(viewer, SIGNAL(midComputation(int)), this, SLOT(midComputation(int))); connect(viewer, SIGNAL(endComputation()), this, SLOT(endComputation())); setcentralwidget(viewer);... }