3D-s számítógépes geometria és alakzatrekonstrukció Tesztkörnyezet I 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 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 Platform-független Tesztelve: Linux, Windows (régen) 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ő
Saját STL könyvtár Qt és C++ 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
Osztályok: Qt elnevezési séma 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)
Fő ablak osztály Programozás Qt-val 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: MyWindow.h:
MyWindow.cpp
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(...))
MyWindow.h: Változások
MyWindow.cpp: Változások
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:
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
Az OpenGL ablak beillesztése MyWindow.h: MyWindow.cpp: