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と互換性のある座標系取得関数が貧弱。