NyARToolkitCS/4.0.0 released

NyARToolkitCS/4.0.0をリリースします。

更新内容

更新内容は以下の通りです。

  • NyARToolkit/4.0.0に搭載したMarkerSystemが利用できるようになりました。
  • Processingライクな簡易スケッチシステム追加しました。
  • ユーティリティクラスのAPIを更新しました。C#のBitmapクラスとの互換性が向上しています。影響により、一部のユーティリティAPIの互換性がなくなっています。アプリケーションの修正して、代替APIを利用してください。
  • WindowsMobileをサポートしなくなりました。(要望があれば復活します。)

ダウンロード

こちらからダウンロードしてください。
http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=7672

Unityバージョンについては、NyARToolkitUnityパッケージを別途作ります。しばらくお待ちください。

 

サンプル

新しいMarkerSystemとスケッチシステムを使ったSimpleLiteは、従来と比較してシンプルに実装できます。

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using jp.nyatla.nyartoolkit.cs.core;
using jp.nyatla.nyartoolkit.cs.markersystem;
using NyARToolkitCSUtils;
using NyARToolkitCSUtils.Direct3d;
using NyARToolkitCSUtils.Capture;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace SimpleLite
{
    class Sketch : D3dSketch
    {
        private const int SCREEN_WIDTH = 640;
        private const int SCREEN_HEIGHT = 480;
        private const String AR_CODE_FILE = "../../../../../data/patt.hiro";

        private NyARD3dMarkerSystem _ms;
        private NyARDirectShowCamera _ss;
        private NyARD3dRender _rs;
        private int mid;
        public override void setup(CaptureDevice i_cap)
        {
            Device d3d=this.size(SCREEN_WIDTH, SCREEN_HEIGHT);
            i_cap.PrepareCapture(SCREEN_WIDTH, SCREEN_HEIGHT, 30.0f);
            INyARMarkerSystemConfig cf = new NyARMarkerSystemConfig(SCREEN_WIDTH, SCREEN_HEIGHT);
            d3d.RenderState.ZBufferEnable = true;
            d3d.RenderState.Lighting = false;
            d3d.RenderState.CullMode = Cull.CounterClockwise;
            this._ms = new NyARD3dMarkerSystem(cf);
            this._ss = new NyARDirectShowCamera(i_cap);
            this._rs = new NyARD3dRender(d3d, this._ms);
            this.mid = this._ms.addARMarker(AR_CODE_FILE, 16, 25, 80);

            //set View mmatrix
            this._rs.loadARViewMatrix(d3d);
            //set Viewport matrix
            this._rs.loadARViewPort(d3d);
            //setD3dProjectionMatrix
            this._rs.loadARProjectionMatrix(d3d);
            this._ss.start();
        }

        public override void loop(Device i_d3d)
        {
            lock (this._ss)
            {
                this._ms.update(this._ss);
                this._rs.drawBackground(i_d3d, this._ss.getSourceImage());
                i_d3d.BeginScene();
                i_d3d.Clear(ClearFlags.ZBuffer, Color.DarkBlue, 1.0f, 0);
                if (this._ms.isExistMarker(this.mid))
                {
                    //立方体を20mm上(マーカーの上)にずらしておく
                    Matrix transform_mat2 = Matrix.Translation(0, 0, 20.0f);
                    //変換行列を掛ける
                    transform_mat2 *= this._ms.getD3dMarkerMatrix(this.mid);
                    // 計算したマトリックスで座標変換
                    i_d3d.SetTransform(TransformType.World, transform_mat2);
                    // レンダリング(描画)
                    this._rs.colorCube(i_d3d,40);
                }
                i_d3d.EndScene();
            }
            i_d3d.Present();
        }
        public override void cleanup()
        {
            this._rs.Dispose();
        }
        static void Main(string[] args)
        {
            new Sketch();
        }
    }
}

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.

NyARToolkit4.0.0a for Unity3D

Unity 3.5から、Webカメラが手軽に使えるようになりましたね。せっかくなので、NyARToolkitCSをUnityに対応させました。正式なバージョンアップまでにはもう少し時間がかかるので、とりあえずα版をリリースします。

NyARToolkitCS for Unity3Dを使うことで、マーカベースARアプリケーションをシンプルなスクリプトで実装することができます。

特徴

  • NyARToolkit/4.0のMarkerSystemAPIを使うことができます。複数マーカ/Idマーカの同時複数使用ができます。
  • 他マーカベースライブラリと異なり、全てC#で実装してあります。WebcamTextureが実装されている全てのUnityプラットフォームで(多分)動作します。
  • ARToolKitV4Proとの統合が可能です。(予定)

ダウンロード

NyARToolkit for Unity3Dのαリリースパッケージをダウンロードしてください。
http://sourceforge.jp/projects/nyartoolkit/releases/?package_id=12917

Getting started

サンプルプログラムSimpleLiteを動かすまでの手順です。

  1. パッケージのダウンロード
    NyARToolkitCS for Unity/4.0.0aのパッケージをダウンロードして、適当なフォルダに展開してください。
  2. パッケージのインポート
    新しいプロジェクトを作って、パッケージをインポートします。
  3. simpleLiteのシーンを復元します。simpleLiteをダブルクリックしてください。現在のシーンをセーブするか聞いてくるので、無視します。
  4. シーンがロードされたら、Webカメラが接続されていることを確認して、Playボタンを押してください。
  5. Hiroマーカを撮影すると、赤い立方体が表示されます。

プログラムの解説

Unity3DでのNyARToolkitを使ったアプリケーションは、MarkerSystemクラスで実装します。

MarkerSystem クラスを使ったアプリケーションに最低限必要なオブジェクトは、1つのMainCamera、1つの背景Panel、マーカの姿勢を保持する Gameobjectです。実際には、Lightや、表示物(サンプルの場合にはCube)もあると良いので、それらのオブジェクトを配置します。

MainCameraと背景Panelのパラメータは、Start関数内でMarkerSystemが自動で設定します。初期値は適当で構いません。

マーカの姿勢行列と背景の更新は、MainCameraに割り当てたスクリプトをから行います。一定周期でWeCamTextureから状態を更新できれば、他の構成をとっても構いません。

using UnityEngine;
using System;
using System.Collections;
using jp.nyatla.nyartoolkit.cs.markersystem;
using jp.nyatla.nyartoolkit.cs.core;
using NyARUnityUtils;
using System.IO;

public class ARCameraBehaviour : MonoBehaviour
{
  private NyARUnityMarkerSystem _ms;
  private NyARUnityWebCam _ss;
  private int mid;//marker id
  private GameObject _bg_panel;
  void Awake()
  {
    NyARMarkerSystemConfig config = new NyARMarkerSystemConfig(320,240);
    this._ms=new NyARUnityMarkerSystem(config);
    mid=this._ms.addARMarker("./Assets/Data/patt.hiro",16,25,80);

    //setup unity webcam
    WebCamDevice[] devices= WebCamTexture.devices;
    WebCamTexture w;
    if (devices.Length > 0){
      w=new WebCamTexture(320, 240, 15);
      this._ss=new NyARUnityWebCam(w);
      //setup background
      this._bg_panel=GameObject.Find("Plane");
      this._bg_panel.renderer.material.mainTexture=w;
      this._ms.setARBackgroundTransform(this._bg_panel.transform);

      //setup camera projection
      this._ms.setARCameraProjection(this.camera);

    }else{
      Debug.LogError("No Webcam.");
    }
  }
  // Use this for initialization
  void Start ()
  {
    //start sensor
    this._ss.start();
  }
  // Update is called once per frame
  void Update ()
  {
    //Update SensourSystem
    this._ss.update();
    //Update marker system by ss
    this._ms.update(this._ss);
    //update Gameobject transform
    if(this._ms.isExistMarker(mid)){
      this._ms.setUnityMarkerTransform(mid,GameObject.Find("MarkerObject").transform);
    }else{
      // hide Game object
      GameObject.Find("MarkerObject").transform.localPosition=new Vector3(0,0,-100);
    }
  }

表示物はGameobject(サンプルではMarkerObject)の子として配置します。MarkerObjectはマーカ表面を(0,0,0)とする座標系ですので、表示物は表面から上方(Z軸)にずらします。

単位系については、mmになます。例えば4Cmの立方体の場合、サイズ40の立方体を定義します。

ライセンス

NyARToolkitCS/4.0.0a for Unity3DはGPLv3です。アプリケーションを公開する場合には、GPLv3であることの表示をお願いします。商用ライセンスについては検討中ですが、NyARToolkitCSのライセンスを購入することで、使用できるようにする予定です。

既知の不具合

  • PCプラットフォーム以外で動作チェックしていない。
  • Frustumパラメータが1箇適当
  • 320×240以外で起動したらUnityが落ちた。WebcamTextureの問題?
  • UnityTextureと互換性のある画像取得系APIがない。
  • Unityと互換性のある座標系取得関数が貧弱。

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;
  }
}