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と互換性のある座標系取得関数が貧弱。
コメントは停止中です。