NyARToolkitV4 alpha

NyARToolkitV4のAPIの実装が終わりました。パッケージを作るのはまだ先になりそうなので、Subversionリポジトリにソースコードをコミットしました。もしよろしければ、バグ探しにお付き合いください。

リビジョン番号は、906になります。

NyARToolkitV4 alpha version is committed  on SVN repository at rev 906. The package release will be released at a few weeks after.  Please try, if you like it!

http://sourceforge.jp/projects/nyartoolkit/svn/view/NyARToolkit/trunk/?root=nyartoolkit

追加機能

  • MarkerSystemの追加
  • JavaGraphicsとの相互運用性の向上
  • スケッチシステムの追加
  • 画像処理機構の再構築
  • ARToolkitV4 proとのインタフェイスの追加
  • その他、APIの変更など沢山

MarkerSystemの追加

MarkerSystemは、ARマーカとNyIdと同時に複数使用できる、新しいマーカ管理モジュールです。NyARToolkit.sample.joglにサンプルコードがあります。

このモジュールは、コンフィギュレーション、画像取得(センサ)、マーカ管理、画像出力(レンダラ)の4モジュールで構成されています。例えば、画像取得モジュールにはQuickTime、JMF、NyARSensorの3種類があり、これらを切り替えて使うことが出来ます。
今回のMarkerSystemは頂点トラッキング機能があり、従来よりも低速時の追従性が向上しています。

JavaGraphicsとの相互運用性の向上

NyARRasterを介して、BufferedImage、OpenGLテクスチャの間で、画像データの相互運用が出来るようになりました。BufferedImageをOpenGLテクスチャに書き込んだり、元画像をbufferedImageで処理したりすることが容易にできます。

スケッチシステムの追加

processingライクな簡易スケッチシステムを追加しました。プロトタイピングが簡単になります。例えば、SimpleLiteをスケッチシステムとMarkerSystemを使って実装すると、60行ほどでプログラムが完成します。

package jp.nyatla.nyartoolkit.jogl.sample.sketch;

import javax.media.opengl.*;
import jp.nyatla.nyartoolkit.*;
import jp.nyatla.nyartoolkit.jmf.utils.*;
import jp.nyatla.nyartoolkit.jogl.sketch.GlSketch;
import jp.nyatla.nyartoolkit.jogl.utils.*;
import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystemConfig;
/**
 * JMFからの映像入力からマーカ1種を検出し、そこに立方体を重ねます。
 * ARマーカには、patt.hiroを使用して下さい。
 */
public class SimpleLite extends GlSketch
{
  private NyARJmfCamera camera;
  private NyARGlMarkerSystem nyar;
  private NyARGlRender render;
  public void setup(GL gl)throws NyARException
  {
    this.size(640,480);
    NyARMarkerSystemConfig config = new NyARMarkerSystemConfig(640,480);
    this.camera=new NyARJmfCamera(config,30.0f);//create sensor system
    this.nyar=new NyARGlMarkerSystem(config);   //create MarkerSystem
    this.render=new NyARGlRender(this.nyar);

    this.id=this.nyar.addARMarker(ARCODE_FILE,16,25,80);
    gl.glEnable(GL.GL_DEPTH_TEST);
    this.camera.start();
  }
  private final static String ARCODE_FILE = "../../Data/patt.hiro";
  private int id;

  public void draw(GL gl)
  {
    synchronized(this.camera){
      try {
        this.render.drawBackground(gl, this.camera.getSourceImage());
        this.render.loadARProjectionMatrix(gl);
        this.nyar.update(this.camera);
        if(this.nyar.isExistMarker(this.id)){
          this.render.loadMarkerMatrix(gl,this.id);
          this.render.colorCube(gl,40,0,0,20);
        }
        Thread.sleep(1);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args)
  {
    try {
      new SimpleLite();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return;
  }
}

画像処理機構の再構築

COMインタフェイスを参考にした画像処理機構を導入しました。従来は画像処理機構と画像オブジェクトが分離したモデルでしたが、今回のモデルでは画像オブジェクトが処理インタフェイスを提供し、アプリケーションはインタフェイスを介して画像オブジェクトを操作する形になりました。低速な汎用の処理系と組み合わせることで、高速性と汎用性を両立し、新しい画像形式や画像処理のオフロード対応を容易にします。

ARToolkitV4 proとのインタフェイスの追加

ARToolKit Professionalある位置合わせ技術を使用するためのインタフェイスを追加しました。Pro版については、近いうちにARToolworksから使えるようにしてもらいます。(多分有料)

なお、ARToolKit Professional版の機能を利用する為の変更は、以下のようにコンフィギュレーションの切替(1行)のみで行えます。

:
this.size(640,480);
//This line activates NyARToolkit professional!
NyARProMarkerSystemConfig config = new NyARProMarkerSystemConfig(640,480);
//NyARMarkerSystemConfig(640,480);
this.camera=new NyARJmfCamera(config,30.0f);//create sensor system
this.nyar=new NyARGlMarkerSystem(config);   //create MarkerSystem
this.render=new NyARGlRender(this.nyar);

その他、APIの変更など沢山

リファクタリング、頻度の低い関数の変更、画像処理系の変更に伴う多量の更新が有ります。

不具合報告/ご要望は、twitter、又はフォーラムまでお寄せください。
please your message to Twitter @nyatla or Forum.

NyARToolkitV4はたぶんこうなります。

NyARToolkitV4を作ってます。

processing版で導入したAPIが好評だったので、同じように使うための仕組みを実装しています。

こんな感じのコードで複数のマーカが認識できるようになる(はず)です。

package jp.nyatla.nyartoolkit.jogl.sample.sketch;

import javax.media.opengl.*;
import jp.nyatla.nyartoolkit.*;
import jp.nyatla.nyartoolkit.core.param.*;
import jp.nyatla.nyartoolkit.jmf.utils.*;
import jp.nyatla.nyartoolkit.jogl.sample.NyARGlMarkerSystem;
import jp.nyatla.nyartoolkit.jogl.utils.*;



/**
 * JMFからの映像入力からマーカ2種を検出し、そこに立方体を重ねます。
 * ARマーカには、patt.hiro/patt.kanjiを使用して下さい。
 */
public class SimpleLite extends GlSketch
{
  private NyARJmfCamera camera;
  private NyARGlMarkerSystem nyar;
  public void setup(GL gl)throws NyARException
  {
    this.size(640,480);
    NyARParam param=new NyARParam();
    param.loadDefaultParameter();
    param.changeScreenSize(640,480);
    this.camera=new NyARJmfCamera(param,30.0f);//create sensor system
    this.nyar=new NyARGlMarkerSystem(param);   //create MarkerSystem
    this.ids[0]=this.nyar.addARMarker(ARCODE_FILE2,16,25,80);
    this.ids[1]=this.nyar.addARMarker(ARCODE_FILE,16,25,80);
    gl.glMatrixMode(GL.GL_PROJECTION);
    gl.glLoadMatrixd(this.nyar.getGlProjectionMatrix(),0);
    gl.glEnable(GL.GL_DEPTH_TEST);
    this.camera.start();
  }
  private final static String ARCODE_FILE = "../../Data/patt.hiro";
  private final static String ARCODE_FILE2 = "../../Data/patt.kanji";
  private int[] ids=new int[2];
  
  public void draw(GL gl)
  {
    synchronized(this.camera){
      try {
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.
        NyARGLDrawUtil.drawBackGround(gl,this.camera.getSourceImage(), 1.0);        
        this.nyar.update(this.camera);
        if(this.nyar.isExistMarker(this.ids[0])){
          gl.glMatrixMode(GL.GL_MODELVIEW);
          gl.glPushMatrix();
          gl.glLoadMatrixd(this.nyar.getGlMarkerTransMat(this.ids[0]),0);
          NyARGLDrawUtil.drawColorCube(gl,40);
          gl.glPopMatrix();
        }
        if(this.nyar.isExistMarker(this.ids[1])){
          gl.glMatrixMode(GL.GL_MODELVIEW);
          gl.glPushMatrix();
          gl.glLoadMatrixd(this.nyar.getGlMarkerTransMat(this.ids[1]),0);
          NyARGLDrawUtil.drawColorCube(gl,40);
          gl.glPopMatrix();
        }
        Thread.sleep(1);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }  
  public static void main(String[] args)
  {
    try {
      new SimpleLite();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return;
  }
}