再描画するたびに、どう処理を行うかを決める部分を実装します。
これまでと同様の方法でクラスを使いします。
具体的には、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的な処理を埋め込めばいいわけなのですが、長いので次へ。