Programmering

Hej JOGL

I nogle år havde en programmør, der ønskede at oprette et grafikintensivt program, der kunne sælges til brugere af forskellige operativsystemer, et valg - OpenGL. GL står for grafikbibliotek. OpenGL er et registreret varemærke tilhørende SGI. OpenGL manifesterer sig som en cross-platform C programmerings-API. I virkeligheden er det dog en hardwareuafhængig specifikation til en programmeringsgrænseflade.

OpenGL er til fremstilling af grafik. Det er hurtigt. Det meste af tiden er det hardware-accelereret. Det ser ud til, at OpenGL kan gøre noget visuelt, som du gerne vil gøre.

Desværre er OpenGL skrevet til C. Lad os indse det, C er ikke det mest populære sprog til programmering af komplekse applikationer. En af de største ulemper ved OpenGL er, at du ikke kan få det til at gøre noget uden et vindue til at sætte din grafik i, men OpenGL giver dig ikke et middel til at oprette vinduer. Dette gør OpenGL svært at lære for begyndere.

Heldigvis blev GLUT (OpenGL Utility Toolkit) introduceret og gjort det lettere at håndtere vinduer, knapper og begivenheder genereret af brugerne. Alligevel kan det at lære OpenGL i C eller endda C ++ være smertefuldt for nye programmører eller programmører, der ønsker at bruge ægte objektorienteret programmering.

Så kom JOGL

Java er muligvis det mest populære ægte objektorienterede programmeringssprog. Der har været mange forsøg på at gifte sig med OpenGL med Java, men den første, der fik alle til at stå op og tage varsel, var Java Bindings for OpenGL eller JOGL. Årsagen til dette er, at denne indsats understøttes af Sun Microsystems (skaberne af Java) og SGI (skaberne af OpenGL).

I dag er JOGL udviklet af spilteknologigruppen hos Sun. Det startede livet som Jungle udviklet af Ken Russel og Chris Kline. Russell er Sun-medarbejder, der arbejder på HotSpot Virtual Machine med mange års 3D-erfaring. Kline arbejder for Irrational Games og er også meget erfaren med 3D-grafik.

Jeg er personligt taknemmelig for deres indsats og indsatsen fra alle dem, der arbejder på JOGL. Der har været adskillige forsøg på at give adgang til OpenGL gennem en venlig Java API - blandt disse har været Java 3D, OpenGL til Java-teknologi (gl4java) og Lightweight Java Game Library (LWJGL). JOGL er den første, som jeg følte mig godt tilpas med.

JOGL er det Sun-understøttede sæt af Java-klassebindinger til OpenGL. Wow! Det var en mundfuld.

OpenGL bruges til at vise 3D-modeller. Det er kraftfuldt, hurtigt og måske den største ting, der skal ske med Java, siden Swing blev introduceret. Ved hjælp af OpenGL via JOGL vil du være i stand til at lave seje spil eller modellsituationer, der kan være for dyre at skabe. Der er skrevet tykke tomater, der beskriver OpenGL. De vil være nyttige, når du kender din vej rundt, men endnu ikke. Du skal lære, hvordan alt dette gælder for Java API'erne, der udsætter OpenGL for dig. Du har også brug for nogle grundlæggende introduktioner til net.java.games.jogl. * og måske nogle opdateringer om matematik.

Fik JOGL?

Hvis du vil bruge JOGL, skal du hente jogl.jar og den medfølgende native kode. Jeg drømmer om dagen, det er standard med Java-installationen, men for nu er det bare en velplaceret drøm.

Det første trick er at finde binære filer til dit operativsystem og udtrække dem. Jeg fandt dem på //games-binaries.dev.java.net/build/index.html. Hvert operativsystem er forskelligt, men der er to dele at installere. Det jogl.jar skal placeres i systemklassestien, og det binære bibliotek skal placeres, hvor som helst biblioteker findes i dit operativsystem. Hvis du er heldig, har du et installationsprogram til at gøre det for dig. Hvis du ikke har et installationsprogram og ikke ved, hvor du skal lede efter oplysninger om at placere alt på din computer, kan du starte med de links, jeg har angivet i Ressourcer. Vores første kodeeksempel vil blive skrevet specifikt for at teste, om du har installeret alt korrekt, så du behøver ikke stresse med at teste din installation indtil da.

Javadocs til JOGL

Javadocs kan opnås på samme sted som den binære distribution af JOGL. Javadocs vil blive navngivet noget, der ligner jogl-1.0-usrdoc.tar.

Hvis du gennemsøger net.java.games.jogl pakke, vil du hurtigt bemærke, at nogle af klasserne er enorme. GL er et perfekt eksempel på dette. Bliv ikke afskrækket af dette. Du finder hurtigt ud af, at du er i stand til at udføre noget ret sofistikeret arbejde, selv med kun en lille smule JOGL-viden. De klasser, du måske vil se på nu, er:

  • GLDrawable
  • GLCanvas
  • GLJPanel
  • GLKapaciteter
  • GLDrawableFactory

Disse vil være din grundlæggende grænseflade til grafikverdenen. Hvis du husker, nævnte jeg tidligere, at en af ​​de største ulemper for begyndere, der lærer OpenGL, er manglen på en vinduessystemstandard. GLUT hjælper langt i den henseende for vores C-kolleger, men vi har Swing og AWT (Abstract Window Toolkit). Det er meget sandsynligt, at du allerede har brugt AWT eller Swing, så du vil ikke føle, at du lærer alt fra bunden. Dette er en god ting. Efter en meget kort introduktion til at få en komponent til JOGL op på skærmen behøver vi ikke meget arbejde for at få dig til at køre temmelig seje og hip apps!

GlueGen ... næsten lige så sej som JOGL?

Som du bør være opmærksom på, er OpenGL skrevet til C-programmører. Dette betyder, at for at Java skal kunne udnytte det, skal der være en indfødt grænseflade. Dette betyder, at JNI (Java Native Interface), som ikke er sjovt eller smukt, skal skrives for at skabe denne forbindelse. OpenGL er ret stor. Det tager tid at skrive alle disse forbindelser. For at gøre tingene bare lidt sværere er der masser af leverandørspecifikke funktioner, og OpenGL forbedrer hele tiden, hvilket betyder, at der er ændringer at følge med. Kort sagt, det har været ret hårdt for "nogen", der forsøger at følge med OpenGL for at skrive en Java til en indfødt grænseflade, der alt sammen omfatter.

Indtast JOGL-folkene. De besluttede at drage fordel af C-headerfiler og skrive nogle kode, der ville gøre alt JNI-arbejde for dem. De kaldte det GlueGen. GlueGen analyserer C-header-filerne og opretter derefter magisk den nødvendige Java- og JNI-kode, der er nødvendig for at oprette forbindelse til disse oprindelige biblioteker. Dette betyder, at opdateringer til OpenGL hurtigt kan tilføjes til JOGL.

Hej Verden!

Jeg er overbevist om tradition, så selvfølgelig starter vi med en "Hello World". Denne Hello World vil undersøge vores installation og fortælle os, om hele eller dele er installeret korrekt. Husk, at der er to dele til JOGL-installationen. Der er Java-biblioteket i en jar-fil og den oprindelige kode i et andet bibliotek.

Her er vores program:

import net.java.games.jogl. *;

offentlig klasse HelloWorld {public static void main (String args []) {try {System.loadLibrary ("jogl"); System.out.println ("Hello World! (De oprindelige biblioteker er installeret.)"); GLCapabilities-hætter = nye GLCapabilities (); System.out.println ("Hej JOGL! (Krukken ser ud til at være tilgængelig.)"); } fange (Undtagelse e) {System.out.println (e); }}}

For det første tester dette program for at se, om de oprindelige og Java-biblioteker er installeret korrekt. JOGL er kun installeret korrekt, når jogl.jar og det oprindelige bibliotek, navngivet noget lignende libjogl.jnilib eller jogl.dll, er begge installeret. Hvis det oprindelige bibliotek ikke er tilgængeligt, kaster dette program en java.lang.UnsatisfiedLinkError undtagelse. Hvis JAR ikke er installeret i klassestien, kompileres programmet ikke engang. Javac-kompilatoren vil sige noget, der ligner "pakke net.java.games.jogl findes ikke. "Når denne klasse kompilerer og kører uden undtagelser, er du klar til at fortsætte med at lære JOGL.

En god skabelon

Lad os gå videre til et par klasser, som du måske synes er nyttigt at bruge som en skabelon, mens vi rodrer med JOGL. Jeg har brugt dem som skabeloner mere end én gang. Du er velkommen til at bruge dem, som du vil.

Denne skabelon består af to klasser. Den første er SimpleJoglApp vist nedenfor, og den anden er SimpleGLEventListener vist efter en kort beskrivelse. Du skal indtaste begge dele for at kompilere skabelonen. Hovedappen:

import java.awt. *; import java.awt.event. *; import javax.swing. *; import net.java.games.jogl. *;

/ ** * Dette er en grundlæggende JOGL-app. Du er velkommen til * at genbruge denne kode eller ændre den. * / public class SimpleJoglApp udvider JFrame {public static void main (String [] args) {final SimpleJoglApp app = new SimpleJoglApp ();

// vis hvad vi har gjort SwingUtilities.invokeLater (ny Runnable () {public void run () {app.setVisible (true);}}); }

offentlig SimpleJoglApp () {// indstil JFrame-titlen super ("Simple JOGL-applikation");

// dræb processen, når JFrame lukkes setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

// kun tre JOGL-kodelinjer ... og her er de GLCapabilities glcaps = nye GLCapabilities (); GLCanvas glcanvas = GLDrawableFactory.getFactory (). CreateGLCanvas (glcaps); glcanvas.addGLEventListener (ny SimpleGLEventListener ());

// tilføj GLCanvas ligesom vi ville have enhver komponent getContentPane (). tilføj (glcanvas, BorderLayout.CENTER); setSize (500, 300);

// centrer JFrame på skærmen centerWindow (dette); }

public void centerWindow (komponentramme) {Dimension screenSize = Toolkit.getDefaultToolkit (). getScreenSize (); Dimension frameSize = frame.getSize ();

hvis (frameSize.width> screenSize.width) frameSize.width = screenSize.width; if (frameSize.height> screenSize.height) frameSize.height = screenSize.height;

frame.setLocation ((screenSize.width - frameSize.width) >> 1, (screenSize.height - frameSize.height) >> 1); }}

Det er det. Lad os fokusere på de tre linjer med JOGL-specifik kode i denne første klasse. At begynde:

GLCapabilities glcaps = nye GLCapabilities ();

Dette bestemmer, hvilke OpenGL / grafikfunktioner der er tilgængelige for vores JOGL-biblioteker og JVM.

Næste:

GLCanvas glcanvas = GLDrawableFactory.getFactory (). CreateGLCanvas (glcaps);

Vi kan ikke skabe GLCanvases eller GLJPanels. Vi er nødt til at få dem oprettet for os af en GLDrawableFactory. Så vi henter en GLDrawableFactory ved brug af GLDrawableFactory's statiske metode, getFactory ().

Nu har vi en GLDrawableFactory, så vi bruger dens createGLCanvas () metode til at oprette en GLCanvas at trække på. Vi kunne have brugt createGLJPanel () metode i stedet for hvis vi havde ønsket en Swing-komponent i stedet for en AWT-komponent.

Bemærk, at vi passerede i GLKapaciteter objekt, vi oprettede tidligere. Dette gør det muligt for GLDrawable vi har skabt for at blive oprettet korrekt.

Endelig er vi klar til at tilføje en GLEventListener til GLCanvas:

glcanvas.addGLEventListener (ny SimpleGLEventListener ());

Vores implementering af GLEventListener er SimpleGLEventListener. Det tager sig af enhver tegning, der skal udføres, når den modtager et opkald fra GLDrawable og vores eneste GLCanvas. Som du vil se, besluttede jeg ikke at tegne noget i dette program. Nu til GLEventListener:

import java.awt. *; import java.awt.event. *; import net.java.games.jogl. *;

/ ** * Til vores formål er kun to af * GLEventListeners vigtige. Disse ville være init () og display (). * / offentlig klasse SimpleGLEventListener implementerer GLEventListener {

/ ** * Pas på initialisering her. * / public void init (GLDrawable drawable) {

}

/ ** * Pas på at tegne her. * / public void display (GLDrawable drawable) {

}

/ ** * Kaldes, når GLDrawable (GLCanvas * eller GLJPanel) har ændret sig i størrelse. Vi har ikke brug for dette, men du har muligvis brug for det - bare ikke endnu. * / public void reshape (GLDrawable drawable, int x, int y, int width, int height) {}

/ ** * Hvis displaydybden ændres, mens * programmet kører, kaldes denne metode. * I dag sker dette ikke meget, medmindre * en programmør har sit program til at gøre det. * / public void displayChanged (GLDrawable drawable, boolean modeChanged, boolean deviceChanged) {}}

Det er hjertet i det JOGL-arbejde, vi vil udføre. Bemærk UML-grafikken nedenfor. SimpleJoglApp er en JFrame. Den indeholder vores GLDrawable, som faktisk er en GLCanvas, men fortæl ham ikke det. Vi tilføjer SimpleGLEventListener, som implementerer GLEventListener til GLCanvasGLCanvas ved, at vi bryr os, hvis han vil have noget OpenGL-arbejde udført. GLDrawables kan tale dit øre, så du vil være sikker på, at din GLEventListener er optimeret ... i virkeligheden.

Denne app kan se lidt krypteret ud afhængigt af dit operativsystem. Dette kan forventes, fordi du lige viser tilfældige bits hukommelse på dette tidspunkt. Så tillykke med dine nyfundne grafiktalenter.

Du er klar til den rigtige ting

Når du har gjort dig bekendt med det foregående eksempel, skal du lave et smukt billede.

Her er din næste app. Sørg for at skrive dette og alle eksempler i. Fejlfinding og rod med dem vil tjene til hurtigt at lære dig, hvordan de fungerer.