NyARToolkit version 4.0.1 Java/C#/Unity Released

NyARToolkit/4.0.1をリリースしました。Java/C#/Unityの同時リリースです。

NyARToolkit for Java

  • MarkerSystemのバグ修正(IdマーカのトラッキングがOFFになっていた問題)
  • 画像タイプにBYTE1D_X8B8G8R8_32を追加
  • NyARGlRender#drawImageをdrawImage2dに変更
  • NyARGlmarkerSystem#getGlMarkerMatrixをgetMarkerMatrixへ変更
  • NyARGlmarkerSystem#getGlMarkerMatrix(int i_id,double[] i_buf)のパラメタを変更
  • NyARGlmarkerSystem#getMarkerPlaneImageの戻り値を変更
  • NyARBufferedImageRasterがB8G8R8X8フォーマットの画像を正しく処理しない不具合を修正。

http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=7512

NyARToolkit for C#

  • Javaに適応した問題の修正

http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=7672

NyARToolkit for Unity

  • NyARToolkit/4.0.1のAPIに対応。
  • サンプルシーン4種を追加。
  • Texture2Dとの画像の相互変換に対応。
  • UnityMarkerSystemクラスを強化。
  • 座標系をX軸で180度回転しました。

http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=12917

English

NyARToolkit/4.0.1 for Java/C#/Unity were released.

NyARToolkit for Java

Fixed some bugs.

  • Updated tracking parametor
  • Fixed a bug of MarkerSystemClass (NyIdMarker did not effect tracking.)
  • Added a new image format BYTE1D_X8B8G8R8_32.
  • Rename NyARGlRender#drawImage to drawImage2d.
  • Rename NyARGlmarkerSystem#getGlMarkerMatrix to getMarkerMatrix
  • Changed parametor of NyARGlmarkerSystem#getGlMarkerMatrix(int i_id,double[] i_buf).
  • Changed the return type of NyARGlmarkerSystem#getMarkerPlaneImage.
  • Fixed a bug of NyARBufferedImageRaster on B8G8R8X8 format.

http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=7512

NyARToolkit for C#

  • Update for NyARToolkit/4.0.1 APIs.

http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=7672

NyARToolkit for Unity

  • Update NyARToolkit/4.0.1 API
  • Added 4 sample seane.
  • Increased Texture2D compatibility.
  • Updated UnityMarkerSystm class.
  • Rotated Z axis around X axis 180 degrees.

http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=12917

NyARToolkit/4.0.0 release

NyARToolkit version 4.0.0をリリースします。

今回の更新では、パフォーマンスを若干犠牲にして、APIの使い勝手とコードの移植性を向上させました。以前のバージョンと比較して、より簡単に、複雑な機能(複数マーカの制御等)が利用できます。

追加機能

主な機能追加は、以前こちらのトピックで紹介した通りですが、もう一つだけ、画像ファイルをそのままマーカパターンに使うための機能を、MarkerSystemに追加しました。

  • MarkerSystemモジュールを追加しました。このモジュールは、NyAR4psgのMultimarkerの上位互換の機能を提供します。自動敷居値設定、複数マーカの管理、トラッキング、座標変換、画像取得機能を提供します。
  • OpenGL環境下で動作する、簡易なスケッチシステムを追加しました。アプリケーションの実装が容易になります。
  • NyARToolkitPro(仮)とのインタフェイスを追加しました。ARToolKitv4のアルゴリズムを、少量の修正のみで、NyARToolkitから使用できるようになります。
  • JavaのBufferedImageとの相互運用インタフェイスを強化しました。PNG画像をマーカパターンに使用したり、画像をBufferedImageで取得することが容易になります。

修正・変更

  • 多くの変更が有ります。一部のAPIは、3.0系のNyARToolkitと互換性がありません。(代替機能は用意してあります。)
  • ラスタ処理系を大幅に変更しました。INyARRaster、INyARRgbRastetrに関連するクラスは、ほぼ全て更新されています。
  • 画像を処理系をグレースケールで処理するようになりました。

ダウンロード

Sorceforcgeからダウンロードして下さい。
http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=7512

English

NyARToolkit version 4.0.0 is released.

In this update, The API access rule and the code portability are more good than old version.  For example, multiple marker handling is more easy. But performance is a little down(3-10%).

New functions

  • MarkerSystem module – The MarkerSystem module provide NyAR4psg like APIs. For example, the module provides, auto threshold detection, multimarker management, tracking , coordinate system converter, image pattern accessor.
  • Sketch system – Sketch system – The sketch system is look like the processing. The sketch system enables application development by shorter code.
  • NyARToolkitV4Pro interface. – NyARToolkitV4 has the NyARToolkitV4Pro addon interface. (It has ARToolKitV4 functions).
  • The interface with BufferedImage of Java is strengthened. For example, a PNG image can be used for a marker pattern as it is.

Update and bugfix

  • A lot of update. Part of APIs are not compatible old NyARToolkit.
  • The raster processor classes was changed a lot. The class revant to INyARRaster and INyARRgbRaster is updated mostly altogether.

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.

NyARToolkit/3.0.0 リリース(ただし、NyARToolkitCSを除く)

NyARToolkit/3.0.0(Java)と、NyARToolkitAS3/3.0.0(ActionScript3)をリリースしました。(NyARToolkitCSについては、実装が間に合わなかったため、来年に見送ります。)

アップデート内容

今回のアップデート内容は以下の通りです。

機能修正

  • 既存モジュールについて、若干の性能向上があります。
  • 既存モジュールについて、再現率の低い不具合をいくつか修正しました。

機能変更

NyARToolkit/3.0.0では、ユーザアプリケーションを修正する必要がある変更を、多く実施しました。

  • 既存モジュールのプロジェクトを整理しました。utils,sampleのプロジェクトについて、前バージョンと互換性がなくなりました。
  • NyARToolkit.utils.jogl配下の関数仕様が大きく変わりました。
  • NyARToolkitモジュール内の関数で、多数の引数変更をしました。

機能追加

NyARToolkit/3.0.0では、より簡単にARアプリケーションを作成するためのコードが追加されています。

  • RPF(RealityPlatform)モジュールを追加しました。このモジュールは、detectorやprocessorに代わるモジュールです。非同期マーカ特定、トラッキング、エッジベース検出、複数マーカ、同一種マーカの取り扱いなどができます。
  • BufferedImageをそのまま取り扱うRasterクラスを追加しました。

不具合

  • RPFのトラッキング機能が不足しているため、平行移動するマーカを正しく追跡できないことがあります。
  • RPFの最適化が不十分であり、十分なパフォーマンスが出ないことがあります。

まとめ

今回追加したRPFモジュールを使用することで、より簡単に、複雑なARアプリケーションが作成できるようになります。たとえば、マーカの画像検索をオンラインで実行したり、マーカ以外の矩形をマーカのように取り扱うことができます。

既存モジュールについても、関数引数の見直し、名前見直しなどの修正があります。そのため、ユーザアプリケーションに若干の修正を加える必要があります。

現在のところ、RPFモジュールを使用しなければ、2.5xから3.x系にアップデートするメリットはあまりありません。RPFを使用しない場合は、2.5系をそのまま使用することをお勧めします。

RPFの詳細については、後日書きます。
それでは、良い新年を。来年もよろしくお願いいたします。

次期NyARToolKitのサンプルになる予定のプログラム

莫大な量のバグと仕様変更に悩まされる今日この頃、皆様いかがお過ごしでしょうか。次期NyARToolKitのテストプログラムがやっと書けるレベルになったので、チラ見せ。書けるだけで、まだまだ動かないけれど。

package jp.nyatla.nyartoolkit.dev.rpf.reality.nyartk.gl;

import java.awt.Frame;
import java.awt.Insets;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.media.Buffer;
import javax.media.opengl.*;
import javax.media.opengl.glu.GLU;

import jp.nyatla.nyartoolkit.NyARException;
import jp.nyatla.nyartoolkit.core.param.NyARParam;
import jp.nyatla.nyartoolkit.core.transmat.NyARTransMatResult;
import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker;
import jp.nyatla.nyartoolkit.dev.rpf.mklib.RawbitSerialIdTable;
import jp.nyatla.nyartoolkit.dev.rpf.reality.nyartk.NyARRealityTarget;
import jp.nyatla.nyartoolkit.dev.rpf.reality.nyartk.NyARRealityTargetList;
import jp.nyatla.nyartoolkit.dev.rpf.realitysource.nyartk.NyARRealitySource_Jmf;
import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureDevice;
import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureDeviceList;
import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;
import jp.nyatla.nyartoolkit.jogl.utils.NyARGLUtil;

import com.sun.opengl.util.Animator;

/**
 * NyARRealityシステムのサンプル。
 * 複数のIDマーカを同時に区別するサンプルです。同一画面内に同じIDが複数あってもOK
 *
 * サンプル実装なのでまだ全然動かないよ。
 * @author nyatla
 *
 */
public class NyARRealityGlTest_CaptureImage implements GLEventListener, JmfCaptureListener
{

	private final static int SCREEN_X = 640;
	private final static int SCREEN_Y = 480;

	private Animator _animator;
	private JmfCaptureDevice _capture;

	private GL _gl;
	private GLU _glu;

	private Object _sync_object=new Object();

	NyARRealityGl _reality;
	NyARRealitySource_Jmf _src;
	RawbitSerialIdTable _mklib;

	public NyARRealityGlTest_CaptureImage(NyARParam i_param) throws NyARException
	{
		Frame frame = new Frame("NyARReality on OpenGL");

		// キャプチャの準備
		JmfCaptureDeviceList devlist = new JmfCaptureDeviceList();
		this._capture = devlist.getDevice(0);
		if (!this._capture.setCaptureFormat(SCREEN_X, SCREEN_Y, 30.0f)) {
			throw new NyARException();
		}
		this._capture.setOnCapture(this);
		//Realityの構築
		i_param.changeScreenSize(SCREEN_X, SCREEN_Y);
		//キャプチャ画像と互換性のあるRealitySourceを構築
		this._src=new NyARRealitySource_Jmf(this._capture.getCaptureFormat(),1);
		//OpenGL互換のRealityを構築
		this._reality=new NyARRealityGl(i_param,0.1,100,3,3);
		//マーカライブラリ(NyId)の構築
		this._mklib= new RawbitSerialIdTable(10);
		//マーカサイズテーブルの作成(とりあえず全部4cm)
		this._mklib.addAnyItem(40);

		// 3Dを描画するコンポーネント
		GLCanvas canvas = new GLCanvas();
		frame.add(canvas);
		canvas.addGLEventListener(this);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});

		frame.setVisible(true);
		Insets ins = frame.getInsets();
		frame.setSize(SCREEN_X + ins.left + ins.right, SCREEN_Y + ins.top + ins.bottom);
		canvas.setBounds(ins.left, ins.top, SCREEN_X, SCREEN_Y);
	}

	public void init(GLAutoDrawable drawable)
	{
		this._gl = drawable.getGL();
		this._gl.glEnable(GL.GL_DEPTH_TEST);
		this._gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		// NyARToolkitの準備
		try {
			// キャプチャ開始
			_capture.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
		this._animator = new Animator(drawable);
		this._animator.start();
		return;
	}

	public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
	{
		_gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
		_gl.glViewport(0, 0, width, height);

		// 視体積の設定
		_gl.glMatrixMode(GL.GL_PROJECTION);
		_gl.glLoadIdentity();
		// 見る位置
		_gl.glMatrixMode(GL.GL_MODELVIEW);
		_gl.glLoadIdentity();
	}

	private double[] __display_wk = new double[16];

	public void display(GLAutoDrawable drawable)
	{
		//RealitySourceにデータが処理する。
		if(!this._src.isReady())
		{
			return;
		}

		// 背景を書く
		this._gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.
		try{
			synchronized(this._sync_object){

				NyARGLUtil.drawBackGround(this._glu,this._src._rgb_source, 1.0);
				// Projection transformation.
				this._gl.glMatrixMode(GL.GL_PROJECTION);
				this._gl.glLoadMatrixd(this._reality.refGlFrastumRH(), 0);
				//ターゲットリストを走査して、画面に内容を反映
				NyARRealityTargetList tl=this._reality.refTargetList();
				for(int i=tl.getLength()-1;i>=0;i--){
					NyARRealityTarget t=tl.getItem(i);
					switch(t.getTargetType())
					{
					case NyARRealityTarget.RT_KNOWN:
						this._gl.glMatrixMode(GL.GL_MODELVIEW);
						// Viewing transformation.
						this._gl.glLoadIdentity();
						// 変換行列をOpenGL形式に変換(ここ少し変えるかも)
						NyARGLUtil.toCameraViewRH(t.refTransformMatrix(), __display_wk);
						_gl.glLoadMatrixd(__display_wk, 0);
						// All other lighting and geometry goes here.
						drawCube();
						break;
					case NyARRealityTarget.RT_UNKNOWN:

						break;
					}
				}
			}
			Thread.sleep(1);// タスク実行権限を一旦渡す
		}catch(Exception e){
			e.printStackTrace();
		}

	}

	/**
	 * カメラのキャプチャした画像を非同期に受け取る関数。
	 * 画像を受け取ると、同期を取ってRealityを1サイクル進めます。
	 */
	public void onUpdateBuffer(Buffer i_buffer)
	{
		try {
			synchronized (this._sync_object)
			{
				this._src.setImage(i_buffer);
				this._reality.progress(this._src);
				//UnknownTargetを1個取得して、遷移を試す。
				NyARRealityTarget t=this._reality.selectSingleUnknownTarget();
				if(t==null){
					return;
				}
				//ターゲットに一致するデータを検索
				RawbitSerialIdTable.SelectResult r=new RawbitSerialIdTable.SelectResult();
				if(this._mklib.selectTarget(t,this._src,r)){
					//テーブルにターゲットが見つかったので遷移する。
					if(!this._reality.changeTargetToKnown(t,r.artk_direction,r.marker_width)){
					//遷移の成功チェック
						return;//失敗
					}
					//遷移に成功したので、tagにユーザ定義情報を書きこむ。
					t.tag=new Long(r.serial);
				}else{
					//一致しないので、このターゲットは捨てる。
					this._reality.changeTargetToDead(t);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)
	{
	}
	/**
	 * 現在の位置に立方体を書く関数です。
	 */
	void drawCube()
	{
		// Colour cube data.
		int polyList = 0;
		float fSize = 0.5f;// マーカーサイズに対して0.5倍なので、4cmの立方体
		int f, i;
		float[][] cube_vertices = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, -1.0f, 1.0f }, { -1.0f, -1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, -1.0f }, { 1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f }, { -1.0f, 1.0f, -1.0f } };
		float[][] cube_vertex_colors = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } };
		int cube_num_faces = 6;
		short[][] cube_faces = new short[][] { { 3, 2, 1, 0 }, { 2, 3, 7, 6 }, { 0, 1, 5, 4 }, { 3, 0, 4, 7 }, { 1, 2, 6, 5 }, { 4, 5, 6, 7 } };

		if (polyList == 0) {
			polyList = _gl.glGenLists(1);
			_gl.glNewList(polyList, GL.GL_COMPILE);
			_gl.glBegin(GL.GL_QUADS);
			for (f = 0; f < cube_num_faces; f++)
				for (i = 0; i < 4; i++) {
					_gl.glColor3f(cube_vertex_colors[cube_faces[f][i]][0], cube_vertex_colors[cube_faces[f][i]][1], cube_vertex_colors[cube_faces[f][i]][2]);
					_gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);
				}
			_gl.glEnd();
			_gl.glColor3f(0.0f, 0.0f, 0.0f);
			for (f = 0; f < cube_num_faces; f++) {
				_gl.glBegin(GL.GL_LINE_LOOP);
				for (i = 0; i < 4; i++)
					_gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);
				_gl.glEnd();
			}
			_gl.glEndList();
		}

		_gl.glPushMatrix(); // Save world coordinate system.
		_gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface.
		_gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis.
		_gl.glDisable(GL.GL_LIGHTING); // Just use colours.
		_gl.glCallList(polyList); // Draw the cube.
		_gl.glPopMatrix(); // Restore world coordinate system.

	}

	private final static String PARAM_FILE = "../Data/camera_para.dat";

	public static void main(String[] args)
	{
		try {
			NyARParam param = new NyARParam();
			param.loadARParamFromFile(PARAM_FILE);
			new NyARRealityGlTest_CaptureImage(param);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return;
	}

}

これは、2.5系のMultiMarkerと同等の機能を実装した、NyARRealityシステムの実証実験プログラムです。複数のIDマーカ(同じ画面内に同一IDがあってもOK)を管理して、ユーザがアクセス可能なマーカRealityを提供します。

大体の流れは、まずマーカ候補を適当に識別して、未知のターゲットとしてトラッキング。その後適当なタイミングで、外部情報を元に既知のマーカーターゲットに変換。既知のマーカターゲットは、ターゲットに関する環境情報をユーザに提供する…。みたいな感じです。

ターゲットの消失と発生管理はNyARRealityが自動で行うので、ユーザは発生と消失のタイミングに合わせて、そのターゲットを修飾する形で実装を行います。また、ターゲットの状態により、ターゲットの情報(位置、色、周辺情報等)を得ることができます。

新しいシステムは、画処理系にも新手法を取り入れているので、パフォーマンスもそこそこ良くなる予定。実際に動かすまで油断はできないけれど、部品単位でみた限りでは、割と期待できると思います。

追記(2010/11/13)

コード間違ってたからか修正。あと、あと二次元系まで接続した画像追加。