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的な処理を埋め込めばいいわけなのですが、長いので次へ。