3D-grafik med OpenGL

Lavniveaugrænseflade

De-facto standarden for at optegne 3D-grafik nu for tiden er OpenGL. Implementeringer af standarden levereres med Microsoft Windows, Mac OS X og XFree86, og de understøtter ofte funktioner for hardwareacceleration som tilbydes af moderne grafikkort. OpenGL selv håndterer kun optegning på et angivet område i rammebufferen gennem en GL-sammenhæng, og har ingen interaktion med værktøjskassen eller miljøet.

Qt tilbyder den grafiske komponent QGLWidget, som indkapsler et vindue med tilhørende GL-sammenhæng. Egentlig bruges det ved at oprette en delklasse af det og omimplementere nogle metoder.

  • I stedet for at implementere paintEvent(), og bruge QPainter til at tegne kontrollens indhold, overskrider man paintGL() og bruger GL-kommandoer til at optegne en scene. QGLWidget tager sig af at gøre sin GL-sammenhæng til den aktuelle inden paintGL() kaldes, og tømmer den bagefter.

  • Den virtuelle metode initializeGL() kaldes en gang inden den første gang inden resizeGL() eller paintGL() kaldes. Dette kan bruges til at oprette visningslister for objekter, og udføre alle initieringer.

  • I stedet for at omimplementere resizeEvent(), overskrider man resizeGL(). Dette kan bruges til at indstille visningsområdet på en passende måde.

  • I stedet for at kalde update() når scenens tilstand er ændret, for eksempel hvis du animerer den med et ur, skal man kalde updateGL(). Dette aktiverer en omtegning.

I almindelighed opfører QGLWidget sig som en hvilken som helst anden grafisk kontrol, dvs. man kan for eksempel håndtere musebegivenheder som sædvanligt, ændre størrelse på kontrollen og kombinere den med andre i et layout.



Qt indeholder nogle eksempler på brug af QGLWidget i demo-eksemplerne. En samling vejledninger findes her, og mere information samt en OpenGL-reference findes på OpenGL's hjemmeside.

Højniveau-grænseflade

OpenGL er en grænseflade på ganske lavt niveau for at tegne 3D-grafik. På samme måde som QCanvas giver programmøren en grænseflade på højere niveau som håndterer objekter og deres egenskaber, er der også grænseflade på højere niveau for 3D-grafik. En af de mest populære er Open Inventor. Oprindelig var det en teknologi som udvikledes af SGI, men i dag er der også en implementering med åben kildekode, Coin, som komplementeres af en værktøjsbinding til Qt, som hedder SoQt.

Det grundlæggende begreb i Open Inventor er en scene. En scene kan indlæses fra disken, og gemmes i et særligt format, nært beslægtet med VRML. En scene består af en samling objekter som kaldes knuder. Inventor sørger allerede for en omfattende samling med genbrugelige knuder, såsom kuber, cylindre og gitre. Desuden er der lyskilder, materiale, kameraer, osv. Knuder repræsenteres af C++ klasser, og kan kombineres og delklasser kan laves.

En introduktion til Inventor findes her (du kan generelt erstatte alle SoXt som nævnes i artiklen med SoQt).