Pozdrav JOGL

Već nekoliko godina programer koji je želio stvoriti grafički intenzivan program koji bi se mogao prodati korisnicima različitih operativnih sustava imao je jedan izbor - OpenGL. GL je kratica za grafičku biblioteku. OpenGL je registrirani zaštitni znak tvrtke SGI. OpenGL se manifestira kao API za programiranje na više platformi. U stvarnosti je to hardverski neovisna specifikacija za programsko sučelje.

OpenGL je za izradu grafika. Brzo je. Većinu vremena to je hardverski ubrzano. Čini se da OpenGL vizualno može učiniti sve što biste vi željeli.

Nažalost, OpenGL je napisan za C. Priznajmo, C nije najpopularniji jezik za programiranje složenih aplikacija. Jedan od najvećih nedostataka OpenGL-a je taj što ne možete učiniti ništa bez prozora u koji biste stavili svoju grafiku, ali OpenGL ne nudi sredstva za stvaranje prozora. Zbog toga je OpenGL teško naučiti za početnike.

Srećom, predstavljen je GLUT (OpenGL Utility Toolkit) koji je olakšao bavljenje prozorima, gumbima i događajima koje generiraju korisnici. Ipak, učenje OpenGL-a na jeziku C ili čak C ++ može biti bolno za nove programere ili programere koji žele koristiti istinsko objektno orijentirano programiranje.

Zatim je došao JOGL

Java je možda najpopularniji istinski objektno orijentirani programski jezik. Bilo je mnogo pokušaja vjenčanja OpenGL-a s Javom, ali prvi koji je sve natjerao da ustanu i primijete je Java Bindings for OpenGL ili JOGL. Razlog tome je što ovaj napor podržavaju Sun Microsystems (kreatori Jave) i SGI (kreatori OpenGL).

Danas JOGL razvija grupa za tehnologiju igara tvrtke Sun. Započeo je život kad su Jungle razvili Ken Russel i Chris Kline. Russell je zaposlenik tvrtke Sun koja radi na virtualnom stroju HotSpot s dugogodišnjim 3D iskustvom. Kline radi za iracionalne igre, a također je vrlo iskusan u 3D grafici.

Osobno sam zahvalan na njihovom trudu i naporima svih koji rade na JOGL-u. Bilo je nekoliko pokušaja pristupa OpenGL-u putem prijateljskog Java API-ja - među njima su Java 3D, OpenGL za Java tehnologiju (gl4java) i Lagana biblioteka Java igara (LWJGL). JOGL je prvi s kojim sam se osjećao ugodno.

JOGL je skup vezova Java klase za OpenGL koji podržava Sunce. Vau! To je bilo zalogaj.

OpenGL se koristi za prikaz 3D modela. Moćna je, brza i možda najveća stvar koja se dogodi Javi od kada je predstavljen Swing. Korištenjem OpenGL-a putem JOGL-a moći ćete stvarati cool igre ili modelirati situacije koje bi mogle biti preskupe za stvaranje. Napisani su debeli tomovi koji opisuju OpenGL. Oni će biti korisni kad se snađete, ali još ne. Morate naučiti kako se sve ovo odnosi na Java API-je koji vam izlažu OpenGL. Također su vam potrebni osnovni uvodi u net.java.games.jogl.*matematiku i možda neki od njih.

Imate JOGL?

Ako želite koristiti JOGL, morat ćete nabaviti jogl.jari pripadajući izvorni kôd. Sanjam o danu kada je to standardno za instalaciju Jave, ali za sada je to samo dobro postavljen san.

Prvi trik je pronalaženje binarnih datoteka za vaš OS i njihovo izdvajanje. Pronašao sam ih na //games-binaries.dev.java.net/build/index.html. Svaki OS je različit, ali postoje dva dijela za instaliranje. jogl.jarMoraju biti smješteni u CLASSPATH sustava, a binarni knjižnica mora biti postavljen gdje god knjižnice otići u svoj OS. Ako imate sreće, imat ćete program za instaliranje koji će to učiniti umjesto vas. Ako nemate instalacijski program i ne znate gdje potražiti informacije o smještanju svega na računalo, možete započeti s vezama koje sam naveo u Resursima. Naš prvi primjer koda bit će napisan posebno za testiranje jeste li sve pravilno instalirali, tako da ne morate naglašavati testiranje svoje instalacije do tada.

Javadocs za JOGL

Javadocs se mogu dobiti na istom mjestu kao i binarna distribucija JOGL-a. Javadocs će dobiti naziv sličan jogl-1.0-usrdoc.tar.

Ako pregledavate net.java.games.joglpaket, brzo ćete primijetiti da su neki od predavanja ogromni. GL je savršen primjer za to. Neka vas ovo ne zastraši. Brzo ćete otkriti da ste u stanju obaviti prilično sofisticiran posao čak i uz samo malu količinu JOGL znanja. Predmeti koje biste možda htjeli pogledati su:

  • GLDrawable
  • GLCanvas
  • GLJPanel
  • GLCapabilities
  • GLDrawableFactory

To će biti vaše osnovno sučelje za svijet grafike. Ako se sjećate, ranije sam spomenuo da je jedan od najvećih nedostataka za početnike koji uče OpenGL nedostatak standarda prozorskog sustava. GLUT u tom pogledu pomaže našim kolegama iz C-a, ali imamo Swing i AWT (Abstract Window Toolkit). Vrlo je vjerojatno da ste već koristili AWT ili Swing, tako da se nećete osjećati kao da sve učite ispočetka. Ovo je dobra stvar. Nakon vrlo kratkog uvoda u postavljanje komponente za JOGL na zaslon, neće nam trebati puno posla da biste pokrenuli prilično cool i moderne aplikacije!

GlueGen ... gotovo jednako cool kao JOGL?

Kao što biste trebali znati, OpenGL je napisan za programere C. To znači da da bi ga Java iskoristila, mora postojati neko izvorno sučelje. To znači da za uspostavljanje ove veze mora biti napisan JNI (Java Native Interface), koji nije zabavan ili lijep. OpenGL je prilično velik. Pisanje svih tih veza zahtijeva vrijeme. Da stvar bude malo teža, postoji obilje značajki specifičnih za dobavljače, a OpenGL se neprestano poboljšava, što znači da postoje promjene koje treba pratiti. Ukratko, "bilo kome" koji pokušava pratiti korak s OpenGL-om bilo je prilično teško napisati Javu na izvorno sučelje koje sve obuhvaća.

Uđite u JOGL ljudi. Odlučili su iskoristiti datoteke zaglavlja C i napisati neki kod koji će za njih obaviti sav JNI posao. Nazvali su ga GlueGen. GlueGen raščlanjuje datoteke zaglavlja C, a zatim čarobno stvara potreban Java i JNI kôd potreban za povezivanje s tim matičnim knjižnicama. To znači da se ažuriranja OpenGL-a mogu brzo dodati u JOGL.

Pozdrav svijete!

Čvrsto vjerujem u tradiciju, pa ćemo naravno započeti s "Zdravo svijete". Ovaj Hello World će ispitati našu instalaciju i reći nam je li sve ili dio ispravno instaliran. Imajte na umu da postoje dva dijela instalacije JOGL. U datoteci jar nalazi se Java knjižnica, a u drugoj knjižnici izvorni kôd.

Evo našeg programa:

import net.java.games.jogl.*;

public class HelloWorld { public static void main (String args[]) { try { System.loadLibrary("jogl"); System.out.println( "Hello World! (The native libraries are installed.)" ); GLCapabilities caps = new GLCapabilities(); System.out.println( "Hello JOGL! (The jar appears to be available.)" ); } catch (Exception e) { System.out.println(e); } } }

Prvo ovaj program testira jesu li matična i Java knjižnice ispravno instalirane. JOGL se ispravno instalira samo kada su jogl.jari matična knjižnica, nazvana nešto poput libjogl.jnilibili jogl.dll, obje instalirane. Ako izvorna knjižnica nije dostupna, ovaj će program java.lang.UnsatisfiedLinkErrorizuzeti. Ako JAR nije instaliran u stazi razreda, tada se program neće ni kompajlirati. Javac prevodilac reći će nešto slično "paket net.java.games.joglne postoji." Kada se ovaj razred kompajlira i izvodi bez iznimki, spremni ste za nastavak učenja JOGL-a.

Dobar predložak

Prijeđimo na nekoliko klasa koje će vam biti korisno koristiti kao predložak dok se zezate s JOGL-om. Više sam ih puta koristio kao predloške. Slobodno ih koristite kako god želite.

This template is made up of two classes. The first is SimpleJoglApp shown below, and the second is SimpleGLEventListener shown after a brief description. You will need to type both in to compile the template. The main app:

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

/** * This is a basic JOGL app. Feel free to * reuse this code or modify it. */ public class SimpleJoglApp extends JFrame { public static void main(String[] args) { final SimpleJoglApp app = new SimpleJoglApp();

// show what we've done SwingUtilities.invokeLater ( new Runnable() { public void run() { app.setVisible(true); } } ); }

public SimpleJoglApp() { //set the JFrame title super("Simple JOGL Application");

//kill the process when the JFrame is closed setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//only three JOGL lines of code ... and here they are GLCapabilities glcaps = new GLCapabilities(); GLCanvas glcanvas = GLDrawableFactory.getFactory().createGLCanvas(glcaps); glcanvas.addGLEventListener(new SimpleGLEventListener());

//add the GLCanvas just like we would any Component getContentPane().add(glcanvas, BorderLayout.CENTER); setSize(500, 300);

//center the JFrame on the screen centerWindow(this); }

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

if (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 ); } }

That is it. Let's focus on the three lines of JOGL-specific code in this first class. To start:

GLCapabilities glcaps = new GLCapabilities();

This determines what OpenGL/graphics features are available to our JOGL libraries and the JVM.

Next:

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

We cannot create GLCanvases or GLJPanels. We need to have them created for us by a GLDrawableFactory. So, we retrieve a GLDrawableFactory using GLDrawableFactory's static method, getFactory().

Now we have a GLDrawableFactory, so we use its createGLCanvas() method to create a GLCanvas to draw on. We could have used the createGLJPanel() method instead if we had wanted a Swing component instead of an AWT component.

Notice that we passed in the GLCapabilities object we created earlier. This allows the GLDrawable we're having created to be created properly.

Finally, we are ready to add a GLEventListener to the GLCanvas:

glcanvas.addGLEventListener(new SimpleGLEventListener());

Our implementation of GLEventListener is SimpleGLEventListener. It will take care of any drawing that needs to be done when it receives a call from the GLDrawable and our one and only GLCanvas. As you will see, I decided not to draw anything in this program. Now for the GLEventListener:

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

/** * For our purposes only two of the * GLEventListeners matter. Those would * be init() and display(). */ public class SimpleGLEventListener implements GLEventListener {

/** * Take care of initialization here. */ public void init(GLDrawable drawable) {

}

/** * Take care of drawing here. */ public void display(GLDrawable drawable) {

}

/** * Called when the GLDrawable (GLCanvas * or GLJPanel) has changed in size. We * won't need this, but you may eventually * need it -- just not yet. */ public void reshape( GLDrawable drawable, int x, int y, int width, int height ) {}

/** * If the display depth is changed while the * program is running this method is called. * Nowadays this doesn't happen much, unless * a programmer has his program do it. */ public void displayChanged( GLDrawable drawable, boolean modeChanged, boolean deviceChanged ) {} }

That is the heart of the JOGL work we will do. Notice the UML graphic below. SimpleJoglApp is a JFrame. It contains our GLDrawable, which is actually a GLCanvas, but don't tell him that. We add the SimpleGLEventListener, which implements GLEventListener to the GLCanvas so the GLCanvas knows we care if he wants any OpenGL work done. GLDrawables can talk your ear off, so you'll want to make sure your GLEventListener is optimized…for real.

This app may look a bit scrambled depending on your OS. This is to be expected because you are just displaying random bits of memory at this point. So congratulations on your new-found graphics talents.

You're ready for the real thing

After you've familiarized yourself with the previous example, make a pretty picture.

Evo vaše sljedeće aplikacije. Svakako upišite ovaj i sve primjere. Otklanjanje pogrešaka i petljanje s njima poslužit će vam kako biste ih brzo naučili kako rade.