公開日:2009/11/1 0:00:00

NyARToolKit for Java

Section 11 ソースコード解説 GLEventListener周り

GLEventListenerの埋め込み

再描画するたびに、どう処理を行うかを決める部分を実装します。

これまでと同様の方法でクラスを使いします。
具体的には、Packageは「jp.sixwish.NyARToolKit.Sample」、Nameは「ARGLEventListener」。
Superclassは空欄のまま、Interfacesを「javax.media.opengl.GLEventListener」を指定。
チェックボックスは三箇所「Constructors from superclass」「Inherited abstract methods」「Generate comments」とします。

/**
 * 
 */
package jp.sixwish.NyARToolKit.Sample;

import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;

/**
 * @author F.Rokubou
 *
 */
public class ARGLEventListener implements GLEventListener {

	/* (non-Javadoc)
	 * @see javax.media.opengl.GLEventListener#display(javax.media.opengl.GLAutoDrawable)
	 */
	@Override
	public void display(GLAutoDrawable arg0) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.media.opengl.GLEventListener#displayChanged(javax.media.opengl.GLAutoDrawable, boolean, boolean)
	 */
	@Override
	public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.media.opengl.GLEventListener#init(javax.media.opengl.GLAutoDrawable)
	 */
	@Override
	public void init(GLAutoDrawable arg0) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.media.opengl.GLEventListener#reshape(javax.media.opengl.GLAutoDrawable, int, int, int, int)
	 */
	@Override
	public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,
			int arg4) {
		// TODO Auto-generated method stub

	}

}

上記の内容を書き換えていきます。

/**
 * Sixwish.jp 実験用サンプルパッケージ
 * 
 * @copyright (C) 2009 The Sixwish project
 * @license http://sixwish.jp/licenses/nyartkgpl The GPL License
 */
package jp.sixwish.NyARToolKit.Sample;

/**
 * @see javax.media.opengl.GL
 * @see javax.media.opengl.GLAutoDrawable
 * @see javax.media.opengl.GLEventListener
 */
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;

/**
 * @see jp.nyatla.nyartoolkit.jogl.utils.GLNyARRaster_RGB
 * @see jp.nyatla.nyartoolkit.jogl.utils.NyARGLUtil
 */
import jp.nyatla.nyartoolkit.jogl.utils.GLNyARRaster_RGB;
import jp.nyatla.nyartoolkit.jogl.utils.NyARGLUtil;

/**
 * @see jp.sixwish.NyARToolKit.Sample.util.Capture
 */
import jp.sixwish.NyARToolKit.Sample.util.Capture;

/**
 * @author F.Rokubou
 *
 */
public class ARGLEventListener implements GLEventListener {
	
	/**
	 * 描画用
	 * @see javax.media.opengl.GL
	 */
	private GL _gl = null;
	
	/**
	 * ウェブカメラから取り込んだ映像をラスターイメージとして処理するためのもの
	 * @see jp.nyatla.nyartoolkit.jogl.utils.GLNyARRaster_RGB
	 */
	private GLNyARRaster_RGB _nyARRaster = null;
	
	/**
	 * JOGLのユーティリティ
	 * @see jp.nyatla.nyartoolkit.jogl.utils.NyARGLUtil
	 */
	private NyARGLUtil _nyARGLUtil = null;
	
	/**
	 * ウェブカメラから映像を取得するためのクラス
	 * @see jp.sixwish.NyARToolKit.Sample.util.Capture
	 */
	private Capture _caputure = null;
	
	/**
	 * Constructor
	 * 
	 * @param capture キャプチャ情報管理オブジェクト
	 */
	public VideoGLEventListener(Capture capture)
	{
		this._caputure = capture;
		this._nyARRaster = this._caputure.getARRaster();
	}
	
	/**
	 * キャプチャ画像の出力と3Dオブジェクトの合成を行う。
	 * Animatorクラスによって、繰り返し呼び出されるメソッドです。
	 *
	 * @param drawable
	 */
	@Override
	public void display(GLAutoDrawable drawable)
	{
		//
		try {
			if (!_nyARRaster.hasData()) {
				return;
			}
			_gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.
			// 画像チェックして背景を書く
			synchronized (_nyARRaster) {
				//背景を書く
				_nyARGLUtil.drawBackGround(_nyARRaster, 1.0);
			}
			
			Thread.sleep(1);//タスク実行権限を一旦渡す
		} catch (Exception e) {
			e.printStackTrace();
		}
		return;
	}

	/**
	 * @see javax.media.opengl.GLEventListener#displayChanged(javax.media.opengl.GLAutoDrawable, boolean, boolean)
	 */
	@Override
	public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)
	{
	}
	
	/**
	 * 初期化処理を行う
	 * キャプチャ画像描写用クラスの生成と、合成3Dオブジェクトプロパティの取得、設定を行います。
	 *
	 * @param drawable
	 */
	public void init(GLAutoDrawable drawable)
	{
		// GLオブジェクトを取得する
		_gl = drawable.getGL();
		_gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		//NyARToolkitの準備
		try {
			//
			_nyARGLUtil = new NyARGLUtil(_gl);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @see javax.media.opengl.GLEventListener#reshape(javax.media.opengl.GLAutoDrawable, int, int, int, int)
	 */
	@Override
	public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
	{
	}

}

編集できたら、このイベントリスナーをパネルに登録します。
これが終われば、カメラからの映像が見えるようになるはず……

本当は自動的に追加されたりもするのだけれど、一応手書きで書いておく。
追加するクラスを書くのが普通なのだけれど、いろいろあるので……

/**
 * @see javax.media.opengl.GLEventListener
 */
import javax.media.opengl.GLEventListener;

クラス変数を定義。

	/**
	 * @see com.sun.opengl.util.Animator
	 */
	Animator animator = null;
	
**	/**
	 * @see javax.media.opengl.GLEventListener
	 */
	private GLEventListener listener = null;**

あとは登録と。

	/**
	 * 初期化処理
	 * ここに各種リスナーを登録する処理を埋め込む。
	 */
	protected void _init() {
		capture = new Capture();
		
		listener = new ARGLEventListener(capture);
		this.addGLEventListener(listener);

		// 再描画用に Animatorスレッド を生成してスタートさせる
		animator = new Animator(this);
		animator.start();
	}

これでSampleを実行すると、ウェブカメラから取得した映像が流れると思います。

あとは、AR的な処理を埋め込めばいいわけなのですが、長いので次へ。