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を動かすまでの手順です。
- パッケージのダウンロード
 NyARToolkitCS for Unity/4.0.0aのパッケージをダウンロードして、適当なフォルダに展開してください。
- パッケージのインポート
 新しいプロジェクトを作って、パッケージをインポートします。
  
- simpleLiteのシーンを復元します。simpleLiteをダブルクリックしてください。現在のシーンをセーブするか聞いてくるので、無視します。
  
- シーンがロードされたら、Webカメラが接続されていることを確認して、Playボタンを押してください。
  
- 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と互換性のある座標系取得関数が貧弱。