UnityでSmartARを使ってLive2Dを表示してみる

##概要
SmartARを使って、サンプルを動かします
ARを検出してLive2Dの描画とかとかやってみます

#モチベーション
UnityでARを使う方法として数日前にVuforiaを使ってみた
他の方法について調べたり、勉強会やプレゼンでSmartARが紹介されたりしたので試すことにした
　
#この記事を一通りなぞるとできるもの
![画面](https://github.com/shima07/qiita/raw/master/simple_unity_smartar/article/img_4956.gif)
　
#準備
##軽く探して見つけた開発に関連しそうなリンク
[SmartAR® SDK(公式)]
(http://www.sonydna.com/sdna/solution/SmartAR_SDK.html)
[SmartAR for Unityの補足情報とプラクティス](http://qiita.com/kuillur/items/e21d2e56fb26c746a6c2)
[SmartARというソニー製AR SDKを試してみる](http://llcc.hatenablog.com/entry/2016/01/28/232356)

##用意するもの
* SmartAR_SDK.zip
* Live2D_SDK_Unity_2.1.00_1_jp.zip

##環境やバージョンの詳細
* SmartAR SDK 現在(2016/02/24)のバージョン 1.0.1（2016年2月15日）
* Live2D Cubism SDK for Unity Version 2.1.00_1
* Unity 5.3.2f1
* Windows 10
* Logicool HD Webcam C270

#SDKのシンプルなプロジェクトを試してみる
SmartARのSDKをダウンロードして解凍すると、
以下のようにネイティブのプロジェクトとUnityのプロジェクト、Toolが展開される

* SmartAR_SDK_Android.zip
* SmartAR_SDK_iOS.zip
* SmartAR_SDK_Unity.zip
* SmartAR_Tool.zip

SmartAR_Tool.zipは、認識対象画像用辞書作成ツールが入っていました。
これは、認識したい対象の画像から辞書データを生成するもので、SmartARのライブラリに読み込ませることで対象物体の検出・トラッキングが可能になるようです。

ネイティブのプロジェクトも読もうかなと思いましたが、
今回はUnityでざっくり作ることを目標としているので、Unityについて見ていきます。
解凍すると直下にREADME.txtが入っているのでそれをざっくり読んでみます。
Documentフォルダ以下にAPI仕様書や概要、使用方法などのファイルがまとまっています。

#Unityのプロジェクトを眺める
Document/SmartARSDK-Overview_j.pdf
Document/SmartARSDK-Unity_j.pdf
この辺を一通り読んで、今後に役立ちそうな情報のまとめと抜粋を。

##Document/SmartARSDK-Overview_j.pdf
SmartAR SDKの概要、使用方法、参考情報についての資料

###モード
SmartARでは2種類のモードがあるようです。

以下、モードについてはドキュメントある部分より抜粋
また、詳細については[認識モードに関する補足](http://qiita.com/kuillur/items/e21d2e56fb26c746a6c2#%E8%AA%8D%E8%AD%98%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A3%9C%E8%B6%B3)も参考になるかと思われます。
また、それぞれのモードの処理の仕組みと、性能を引き出すための詳細が確認できます。

####TargetTrackingモード 
指定された認識対象をカメラ画像内から検出・追跡し、認識対象に対するSmartAR動作端末の位置と向きを推定するためのモード

####SceneMappingモード 
SmartAR動作端末を空間中で動かすことで、カメラ画像の変化とセンサー情報から、カメラに映った未知の空間の3D構造と、その空間内でのSmartAR動作端末の位置と向きを推定するモード

##SmartARSDK-Unity_j/e.pdf
SmartAR SDK Unity Pluginの概要、使用方法についての資料
以下、この資料の内容を確認しながらなぞって実行していきました。

とりあえず、サンプルを実行したかったので、
2 対応環境・ビルド環境(p5)を確認して、問題なさそうだったので、
3 SmartARTM SDK Unity3D Plugin 概要(p6)を確認
7 サンプルアプリケーションの実行方法(p20)を読みました

SmartAR SDK Unity3D Pluginには2種類のプラグイン(.unitypackage)が用意されている
###SmartAR_SDK_Unity/SmartAR/smartar_moving_target.unitypackage
>カメラ位置を固定し、重畳オブジェクトの位置を移動します。
このPluginではSmartAR SDKの全ての機能を使用することができます。
ターゲットの位置を移動するのでターゲット配下のオブジェクトが増えるとパフォーマンスに影響が出ます。
また、重畳オブジェクトへの動的な操作やパーティクルの指定などの操作を行う場合に調整が複雑になり開発の難易度が上がる可能性があります。

###SmartAR_SDK_Unity/SmartAR/smartar_moving_camera.unitypackage
>重畳オブジェクトの位置を固定し、カメラの位置を移動します。
SmartAR SDKが移動するオブジェクトはカメラのみなのでsmartar_moving_targetよりもパフォーマンスに優れます。
また、SmartAR SDK が重畳オブジェクトの子オブジェクトに影響を与えないのでUnity 上での開発のしやすさも優れます。 

#実際に動かしてみる
トラッキングとパフォーマンスと、
簡単な検証のために、smartar_moving_camera.unitypackageを選択しました。
プラグインの読み込みと、Prefabの使い方は、Plugin の使用方法(p9)を見ながら
設定の詳細については、4 Plugin 共通コンポーネント(p10)以降を確認しながら行いました。
※軽い補足ですが、Plugin の使用方法(p9)の手順(4)ですが、Hierarchyの「SmartAR Camera」のInspectorにある、SmartARControllerとSmartAREffectorの設定を行う、かと思われます。

###サンプルを実行する
インポート後に、Projectから、SmartAR/Sample/Scenes/sample_smartarを開きます。
シーンについては、含まれるサンプルアプリケーションについて(p16)以降に箇条書きで記されています。

実行！
![画面](https://github.com/shima07/qiita/raw/912d86e7abbe360460542d30446bc81a77e6121c/simple_unity_smartar/article/img_4955.gif)
※この時はRealSenseのカメラを使っていました
※うまく実行できない、クラッシュする場合は、
UnityEditor上で実行するための方法や、ビルドについての詳細が
7 サンプルアプリケーションの実行方法(p20)あたりに書いてありますので確認してみてください。

マーカを一度認識すると、このようにマーカの一部が隠れても正しく認識し続けてくれました。すごい。
![2016-02-24_16h07_11.png](https://qiita-image-store.s3.amazonaws.com/0/76553/4abbb942-5280-8e9a-d5c7-f77a26cba949.png)


###既存プロジェクトへ追加、設定の仕方
SDKのインポート後、自分のプロジェクト（画面は新規から追加していきました）に追加していく場合はこのようになるかと思われます

今回は、Live2DのSDKのSampleApp1のハルを表示してみることにします。

* SampleApp1のシーンを開いて、MainCameraを削除
* SmartARのSDKをimport
* ProjectのSmartAR/PrefabsにあるSmartAR CameraとSmartAR TargetをHierarchyに設置
![2016-02-24_23h02_07.png](https://qiita-image-store.s3.amazonaws.com/0/76553/429488fc-18d7-8606-c1d9-e54e7afd8a5e.png)
　

* SmartAR TargetのInspector/Target EffectorのTarget IDにsample01.v9.dicを設定
![2016-02-24_23h02_56.png](https://qiita-image-store.s3.amazonaws.com/0/76553/1cc85743-e133-4b58-25b0-009409f7b765.png)
　

* SmartAR Targetの子に、Live2Dのモデルを配置
![2016-02-24_23h00_59.png](https://qiita-image-store.s3.amazonaws.com/0/76553/db6d2b01-b8b1-5577-1e11-dea8f9aa68a7.png)
　

* SmartAR CameraのInspector/Smart AR Controller/Recognizer Settings/Targetsのsizeを1に変更してFile NameとIDをsample01.v9.dicに設定
![2016-02-24_23h03_47.png](https://qiita-image-store.s3.amazonaws.com/0/76553/768eb1d6-857d-68db-2415-1674d0d7a917.png)
　
追記、以下に不要な手順がありました
> SmartAR CameraにProject/SmartAR/Sample/ScriptsにあるAppControllerをアタッチ
> アタッチした、App ControllerのMy SkinにProject/SmartAR/Sample/Skins/Sample GUISkinを設定
> アタッチした、App ControllerのSmart AR ControllerにHierarchyのSmartAR Cameraを設定します
![2016-02-24_23h04_33.png](https://qiita-image-store.s3.amazonaws.com/0/76553/15049c17-26e4-6080-f5a2-f8775ad285d3.png)
　

この状態で実行すると以下のようになります。
![2016-02-24_22h47_19.png](https://qiita-image-store.s3.amazonaws.com/0/76553/f0c73a76-1107-8e3d-b834-08c173b2b592.png)
　
iOS向けのビルドも簡単にできました。
![画面](https://github.com/shima07/qiita/raw/master/simple_unity_smartar/article/img_4956.gif)
　
書き出し時のAuto Graphics APIをOpenGL2に設定するところだけ注意が必要です。
![スクリーンショット 2016-02-25 2.42.04.png](https://qiita-image-store.s3.amazonaws.com/0/76553/4837d890-5af1-52bd-51d6-f9d1af7de6ce.png)

　
もしも以下のようにモデルが紫になってしまっている場合は、
![2016-02-24_22h44_40.png](https://qiita-image-store.s3.amazonaws.com/0/76553/e547d507-4e93-0710-51ab-cd17995ce518.png)

UnityのFile/Build Settings/Player Settings...を開き、
Auto Graphics API for Windowsのチェックを外し、以下のようにOpenGL2を選択してビルドしなおしましょう

#まとめ
SmartARもかなり良さそう。使いやすそう。
ドキュメントとかも安定しているイメージ。
今後は、検出したい画像の辞書の生成と、SmartAR Cameraの詳細設定周りの記事とか書きます。
精度やVuforiaとの比較などについては時間があったらになりそうです。