Kurs Qt – część 8 – OpenGL

Matthew @ 2010-04-17 — Kategorie: Kurs Qt, Programowanie, Qt, Techblog

Kolejna część kursu Qt. Dzisiaj trochę o OpenGL. Czemu tylko trochę? Niestety nie znam go zbyt dobrze (ot, tylko tyle, żeby sobie przy pomocy innych kursów coś narysować, ale i to nie zawsze mi wychodzi), więc jedyne co pokażę to jak wykorzystać odpowiedni komponent dostarczany wraz z Qt do renderowania prostych figur (a Ci którzy się na OpenGL znają zrobią z tego jakiś pożytek ;)).

To co udało mi się uzyskać w ten sposób wygląda mniej więcej tak:

OpenGL

Jak widać mamy jeden różnokolorowy trójkąt i napis na górze. Aby to osiągnąć wystarczy jedna klasa zawierająca kilka metod:

Klasa dostarcza nam 3 podstawowych (w rzeczywistości jest ich więcej, ale na proste zadania tylko te 3 są nam potrzebne) metod które musimy przesłonić. initializeGL() jest wywoływana na samym początku, używamy jej do określenia ustawień początkowych OpenGL. paintGL() jest wywoływana przy „przerenderowaniu” zawartości widgetu, natomiast resizeGL() jest wywoływana w przypadku zmiany rozmiaru okna. W moim przykładzie metody te wyglądają tak:

Z powodów opisanych na początku nie będę mówił co robią poszczególne funkcje. Opiszę jedynie metodę renderText(). Służy ona do wyświetlania tekstu na naszym widgetcie. Jednak nie renderujego go w OpenGL, ale wyświetla jakby „nad”. Najlepiej zobrazować to poprzez zmianę rozmiaru okna, gdzie w tym momencie wielkość trójkąta się zmienia a napis pozostaje nadal taki sam. Pierwszym parametrem jest pozycja x tekstu (liczona od lewego górnego rogu widgetu), następnie pozycja y, dalej tekst który chcemy wyświetlić oraz opcjonalny font jakiego chcemy użyć. Tutaj należy uważać, gdyż punkt wskazywany przez współrzędne leży pod tekstem a nie nad. Więc jeżeli damy za dużą wielkość czcionki a za mało miejsca od góry to napis zostanie obcięty.

Mamy jeszcze możliwość zapisu do pliku graficznego naszego dzieła. W tym celu dodatkowo wprowadziliśmy obsługę klawiatury przesłaniając metodę keyPressEvent():

Przy wciśnięciu klawisza S następuje utworzenie obiektu klasy QPixmap oraz zapisanie w nim obrazu który wyrenderowaliśmy. Klasa QPixmap zawiera metodę save() która po podaniu (kolejno) nazwy pliku, typu (opcjonalny, jeżeli nie podamy, zostanie wywnioskowany z rozszerzenia w nazwie pliku) oraz jakości (również opcjonalny). Wywołanie jej spowoduje zapis naszego obrazka w lokalizacji podanej w nazwie pliku (lub jeżeli podaliśmy samą nazwę to w katalogu w którym znajduje się binarka naszego programu).

W przypadku gdybyśmy chcieli zrobić nasze 3D bardziej dynamiczne, należy wywoływać metodę updateGL() w celu ponownego wyrenderowania sceny.

Na dzisiaj to tyle. Mam nadzieję, że komuś uda się stworzyć coś bardziej pożytecznego niż trójkąt. ;) Jak zwykle repozytorium gita z kodem z kursu: git://github.com/matthewpl/qt8.git. Mam nadzieję, że następna część pojawi się szybciej i będzie dłuższa od tej. Chociaż może to być bardzo ciężkie.

Komentarze:

czy można prosić o spakowanie całego kodu i udostępnienie go :-)

Żeby działały funkcję z openGLa należy w pliku .pro projektu dodać linijkę:
QT += opengl
bez tego nie będzie widać openGL’owych klas.

nie znajduje mi funkcji: gluPerspective(), a odpaliłem twój projekt matthew.

w wersji 4.8.0 wykasowali QtOpenGL/qgl.h i trzeba dorzucić linijkę #include . http://qt-project.org/forums/viewthread/14269

Dodaj komentarz:

 

Subscribe without commenting