JOGL OpenGL in Java Lv1〜JOGLでハローワールド〜

イントロダクション

前回、JOGLのインストールとサンプルコードを実行しました。実行して動いたのを確認したので、今度は内容を理解します。

Introduction

Last time, we execute sample code and check blank view. And this time we learn sight of sample code.

 サンプルコード(Sample Code)

package zenryokuservice.gui.mtm;

import javax.swing.JFrame;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;

public class  MultiTaskManager implements GLEventListener {
   /** 初期処理 */
   public void init(GLAutoDrawable drawable) {
     // 画面を初期化する
     GL2 gl = drawable.getGL().getGL2();
     // black background(黒で初期化)
     gl.glClearColor(0, 0, 0, 0);
   }

  /**
   * Draw 2D graphics "H"
   * 2次元描画で"H”を描く
   */
   public void display(GLAutoDrawable drawable) {

      // 表示 start GL(GL2 or GL2)
      GL2 gl = drawable.getGL().getGL2();
      gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
      // draw in red
      gl.glColor3d(1, 0, 0);
      // draw "H"
      gl.glBegin(GL2.GL_LINES);
      // raw line
      gl.glVertex2d(-0.8, 0.8);
      gl.glVertex2d(-0.8, -0.8);
      gl.glVertex2d(-0.8, 0.0);
      gl.glVertex2d(-0.4, 0.0);
      gl.glVertex2d(-0.4, 0.8);
      gl.glVertex2d(-0.4, -0.8);
      // stop draw
      gl.glEnd();
   }

   public void dispose(GLAutoDrawable arg0) {
      //method body
   }

   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
      // method body
   }

   public static void main(String[] args) {
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
               
      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      MultiTaskManager b = new MultiTaskManager();
      glcanvas.addGLEventListener(b);
      glcanvas.setSize(400, 400);
      //creating frame
      final JFrame frame = new JFrame (" Basic Frame");
      //adding canvas to it
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }//end of main
}//end of classimport    

読み始め(Start to read)

メインメソッド

Javaのプログラムは必ずメインメソッドから始まります。なのでまずはメインメソッドからみていきます。

Always Java program start in main method. so we watch from main method to end.

ステップ

  1. メインメソッドの起動〜GL2の生成:GLProfileを使用してGL2クラスを生成します。(2D描画に使用します)
  2. GLCapabilitiesを生成します。これはGLCanvasの生成に使用するクラスのようです。
  3. GLCanvasクラスを生成し、今回作成したクラス「MultiTaskManager」のインスタンスを作成して、Canvasに追加します。(Event登録します)、そして、表示するサイズをGLCanvasに設定します。
  4. JFrame(Swingの部品)を生成して、各種設定を行い表示処理を行います(setVisible(true))

Step

  1. From start main method to create GL2 class: using "GLProfile" and create GL2 class.
  2. create "GLCapabilities" class, for create GLCanvas class
  3. create "MultiTaskManager" class for set Event that OpenGL draw or some event. and set GLCanvas to draw something that we implemented.
  4. create JFrame(parts of Swing), and setting for JFrame to view.

重要なとこ

ここで重要なのは、〜GLの部品を最終的にJFrameに設定しているところです。

Swingでの描画(GUI)は土台にJFrame(Frame)を使用しています(他にはJDialoなど)。

Importants

It's important that XX_GL class set to JFrame. It's mean JFrame is base of view in Java Swing.

<登場人物(クラス)の整理>

  • GL2: 描画クラス->GLProfileクラスで作成(生成)される
  • 作成したクラス(MultiTaskManager) -> 各種イベントに対応する処理(今回は描画)
  • JFrame: 土台

オーバーライドメソッド(GLEventListenerのメソッド)

GLEventListenerインターフェースを実装(オーバーライド)する事で描画処理(display())を起動するときにその内容を定義(実装)できます。実際の処理はサンプルコードを見ればわかるように、「display」メソッドに実装してある内容が処理の結果として表示されています。

List of classes

MultiTaskManager class implements GLEventListener. that why execute "init()" , "diplay()" and "dispose" and "reshape". you can implements each method you would like to. it is "Override".

Hello Worldの「H」のみが描画されています。これは。。。そのように実装しているので。。。まぁそんなもんでしょう。

自分でいじってみようと思うならまず初めに「」メソッドからいじって見ると良いでしょう。自分もいじってみます(笑)

If you would like to implmets little bit code, then you implement "display()". I recommend. And I will implement too(笑).