こんにちはJOGL

ここ数年、さまざまなオペレーティングシステムのユーザーに販売できるグラフィックを多用するプログラムを作成したいと考えていたプログラマーには、OpenGLという1つの選択肢がありました。GLはグラフィックライブラリの略です。OpenGLはSGIの登録商標です。OpenGLは、クロスプラットフォームのCプログラミングAPIとして現れます。ただし、実際には、これはプログラミングインターフェイスのハードウェアに依存しない仕様です。

OpenGLはグラフィックを作成するためのものです。速いです。ほとんどの場合、ハードウェアアクセラレーションです。OpenGLはあなたがやりたいことを視覚的に何でもできるようです。

残念ながら、OpenGLはC用に書かれています。それに直面しましょう。Cは複雑なアプリケーションをプログラミングするための最も一般的な言語ではありません。OpenGLの最大の欠点の1つは、グラフィックを配置するためのウィンドウがないと何も実行できないことですが、OpenGLにはウィンドウを作成する手段がありません。これにより、OpenGLは初心者にとって習得が困難になります。

幸い、GLUT(OpenGL Utility Toolkit)が導入され、ユーザーが生成したウィンドウ、ボタン、およびイベントの処理が簡単になりました。それでも、CまたはC ++でOpenGLを学ぶことは、新しいプログラマーや真のオブジェクト指向プログラミングを使用したいプログラマーにとっては苦痛になる可能性があります。

次にJOGLが登場しました

Javaは、おそらく最も人気のある真のオブジェクト指向プログラミング言語です。OpenGLとJavaを組み合わせる試みは数多くありますが、誰もが立ち上がって注目を集めた最初の試みは、OpenGL用のJavaバインディング(JOGL)でした。この理由は、この取り組みがSun Microsystems(Javaの作成者)とSGI(OpenGLの作成者)によってサポートされているためです。

現在、JOGLはSunのゲームテクノロジーグループによって開発されています。それは、ケン・ラッセルとクリス・クラインによって開発されたジャングルとして始まりました。Russellは、長年の3D経験を持つHotSpot仮想マシンに取り組んでいるSunの従業員です。KlineはIrrationalGamesで働いており、3Dグラフィックスの経験も豊富です。

私は彼らの努力とJOGLに取り組んでいるすべての人々の努力に個人的に感謝しています。使いやすいJavaAPIを介してOpenGLへのアクセスを提供する試みがいくつかありました。その中には、Java 3D、OpenGL for Java Technology(gl4java)、およびLightweight Java Game Library(LWJGL)があります。JOGLは、私が最初に快適に感じたものです。

JOGLは、SunがサポートするOpenGLのJavaクラスバインディングのセットです。うわー!それは一口でした。

OpenGLは、3Dモデルを表示するために使用されます。これは強力で高速であり、Swingが導入されて以来Javaに起こる最大の出来事です。JOGLを介してOpenGLを使用すると、作成するにはコストがかかりすぎる可能性のあるクールなゲームやモデルの状況を作成できます。OpenGLを説明する厚い書物が書かれています。方法がわかれば便利ですが、まだです。これがすべて、OpenGLを公開するJavaAPIにどのように適用されるかを学ぶ必要があります。またnet.java.games.jogl.*、数学の基本的な紹介と、おそらく数学の復習も必要です。

JOGLを手に入れましたか?

JOGLを使用する場合は、jogl.jarとそれに付随するネイティブコードを取得する必要があります。私はそれがJavaインストールの標準である日を夢見ていますが、今のところそれはちょうど良い場所にある夢です。

最初のトリックは、OSのバイナリを見つけて抽出することです。//games-binaries.dev.java.net/build/index.htmlで見つけました。OSはそれぞれ異なりますが、インストールには2つの部分があります。jogl.jarシステムクラスパスに置かなければならない、とライブラリがOSにどこへ行くのバイナリライブラリを配置する必要があります。運が良ければ、インストーラーでそれを実行できます。インストーラーがなく、コンピューターにすべてを配置するための情報を探す場所がわからない場合は、「リソース」で提供したリンクから始めることができます。最初のコード例は、すべてが正しくインストールされているかどうかをテストするために特別に作成されているため、それまではインストールのテストについてストレスを感じる必要はありません。

JOGL用のJavadoc

Javadocは、JOGLのバイナリ配布と同じ場所で入手できます。Javadocには、に似た名前が付けられますjogl-1.0-usrdoc.tar

net.java.games.joglパッケージを閲覧すると、いくつかのクラスが巨大であることがすぐにわかります。GLはこれの完璧な例です。これに躊躇しないでください。JOGLの知識が少しでも、かなり洗練された作業を実行できることがすぐにわかります。あなたが今一瞥したいと思うかもしれないクラスは次のとおりです:

  • GLDrawable
  • GLCanvas
  • GLJPanel
  • GLCapabilities
  • GLDrawableFactory

これらは、グラフィックスの世界への基本的なインターフェイスになります。覚えているかと思いますが、OpenGLを学ぶ初心者にとっての最大の欠点の1つは、ウィンドウシステム標準がないことです。GLUTは、Cの対応物に関してはその点で大いに役立ちますが、SwingとAWT(Abstract Window Toolkit)があります。すでにAWTまたはSwingを使用している可能性が高いため、すべてを最初から学習しているように感じることはありません。これは良いことです。JOGLのコンポーネントを画面に表示するための非常に簡単な紹介の後、かなりクールでヒップなアプリを実行するために多くの作業を行う必要はありません。

GlueGen ... JOGLとほぼ同じくらいクールですか?

ご存知のとおり、OpenGLはCプログラマー向けに書かれています。これは、Javaがそれを利用するには、ネイティブインターフェイスが必要であることを意味します。つまり、この接続を確立するには、面白くもきれいでもないJNI(Java Native Interface)を作成する必要があります。 OpenGLはかなり大きいです。これらすべての接続の書き込みには時間がかかります。物事をもう少し難しくするために、ベンダー固有の機能がたくさんあり、OpenGLは改善を続けています。つまり、それに追いつくための変更があります。要するに、OpenGLに追いつくことを試みる「誰でも」が、すべてを網羅するJava to NativeInterfaceを作成することはかなり困難でした。

JOGLの人々を入力してください。彼らは、Cヘッダーファイルを利用して、すべてのJNI作業を実行するコードを作成することにしました。彼らはそれをGlueGenと呼んだ。GlueGenはCヘッダーファイルを解析し、それらのネイティブライブラリに接続するために必要なJavaおよびJNIコードを魔法のように作成します。これは、OpenGLへの更新をJOGLにすばやく追加できることを意味します。

"こんにちは世界"

私は伝統をしっかりと信じているので、もちろん「HelloWorld」から始めます。このHelloWorldは、インストールを調べて、全部または一部が正しくインストールされているかどうかを通知します。JOGLのインストールには2つの部分があることに注意してください。jarファイルにはJavaライブラリがあり、別のライブラリにはネイティブコードがあります。

これが私たちのプログラムです:

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

First, this program tests to see if the native and Java libraries are installed correctly. JOGL is installed properly only when the jogl.jar and the native library, named something like libjogl.jnilib or jogl.dll, are both installed. If the native library is not accessible, this program will throw a java.lang.UnsatisfiedLinkError exception. If the JAR is not installed in the classpath, then the program will not even compile. The javac compiler will say something similar to "package net.java.games.jogl does not exist." When this class compiles and runs without exceptions, you are ready to continue learning JOGL.

A good template

Let's move on to a couple of classes that you may find useful to use as a template while messing around with JOGL. I've used them as templates more than once. Feel free to use them however you like.

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.

これがあなたの次のアプリです。これとすべての例を必ず入力してください。デバッグしてそれらをいじり回すと、それらがどのように機能するかをすばやく知ることができます。