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 ●
●
Linux virtuális gépen ajánlott ●
● ●
Tesztelve: Linux, Windows (régen) BME Cloud: http://cloud.bme.hu/
Probléma esetén:
[email protected] 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: ●
● ● ● ●
●
●
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 ●
●
http://www.qt.io/
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: ●
●
Konstansok: ● ●
●
QSomeClass::EnumType → ValueOne, ValueTwo; Qt::EnumType → Qt::ValueOne, Qt::ValueTwo;
Metódusok: ●
●
QSomeClass (→ #include
)
QSomeClass::someMethod(...)
Tulajdonságok: ● ●
QSomeClass::someProperty() QSomeClass::setSomeProperty(...)
A Signal-Slot kommunikáció (1) ●
Események (event): ● ●
●
●
Cél: ● ●
●
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.) 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 ● ● ● ●
●
Főprogram ● ●
● ●
Egy Qt osztályból származtatva Q_OBJECT Kibővítve (új signalok, slotok) Testreszabva (virtuális metódusok újraírása) 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(...))
Változások ●
MyWindow.h:
Változások ●
MyWindow.cpp:
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:
Virtuális függvények ●
void init(): ●
●
void draw(): ●
●
OpenGL kirajzolás
void keyPressEvent(QKeyEvent *): ●
●
OpenGL beállítások inicializáláskor, pl.: glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1); [mindkét oldal legyen megvilágítva]
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: