ナノカ技術メモ

ただのエンジニア。何でも屋みたいな扱い受けてます。

SmartARのUnity用SDKのサンプルを検証

検証環境
Windows:OS.10
Mac:Sierra(10.12.1)
Unity:5.3.2 Free版
Xcode:8.1
iOS:8.0
SmartAR:1.1.0

SmartARとは

SmartARについてとSDKをダウンロードするまではこちらをどうぞ
madgenius.hateblo.jp

パッケージを追加

とりあえず、パッケージを追加するために新規でプロジェクトを作成。
サンプルがあるsmartar_moving_target.unitypackageをダブルクリックでいつもAssetのImportのWindowが出てきます。
Importの速度は速いので待ち時間はそんなにないです。

Importされました。
PluginとSmartARのフォルダ、StreamingAssetsには辞書ファイルが追加されました。
f:id:nanokanato:20170417102232p:plain:w300

サンプル再生するまでの失敗

いくつかサンプルを再生するまでに失敗がありましたので途中で詰まっている方などのために経緯を書いておきます。(2016/11/28現在時点)
Sceneは「Assets/SmartAR/Sample(You can remove from project.)/Scenes/」に「sample_api_full.unity」があるのでこちらを使用しています。

MacのUnityEditorでは再生できない

ビルド時エラー(Mac UnityEditor)

(ん?辞書作成ツールがMac非対応、PluginsにMacがないという走馬灯...)
公式のPDFによるとMacでのUnity Editorでの再生はできないとのこと。
つまり開発はWindowsでやってiOSに入れる時だけMacXcode向けにビルドしろってことみたい。
いずれは公式にMac対応していただきたい...

Unity5.3.2より新しいバージョンでは動作できない

MacがダメらしいのでWindowsに切り替えてUnity5.4.1を起動してサンプルを読み込み動作させる

ビルドするとUnityがクラッシュ!
これは心折れるやつ。

公式PDFに5.3 ~ 5.4.0に対応しているとのこと。
しかし、5.4.0に変えてもダメ...と少しずつダウングレードしたところ5.3.2でクラッシュはしなくなりました。

これに関しては公式がそのうち対応してくれるでしょう。

GraphicsAPIをOpenGLに変えないといけない

以下引用は解決するまでに試したこととして省略可なので流し読み程度でどうぞ。

調べるとUnityをOpenGLモードで起動するのが必須とのこと。

先ほどのショートカットをこのまま起動するのではなく、右クリックでプロパティを開きます。
ショートカットのリンク先に"~~Unity.exe"とあるので後ろに` -force-opengl`と追記して適用してOKしましょう。名前もわかりやすいように変更しました。
f:id:nanokanato:20170417102659p:plain:w300 f:id:nanokanato:20170417102716p:plain:w50

作ったショートカットからUnityを起動して作成したプロジェクトを開く。
上のバーにOpenGLと書いてあるとOpenGLモードになっているようです。
f:id:nanokanato:20170417102743p:plain:w300

ビルド!動作しない!(いつもの)

しかもウィンドウをリサイズしたら変になったのでUnity再起動。
f:id:nanokanato:20170417102759p:plain:w300

Documentに入っていたPDF、SmartARSDK-Unity_j.pdfのp20に以下の文が...

「SmartARTM Unity3DPluginではGraphicsAPIにOpenGLを使用するように設定する必要があります。」

とりあえず、UnityのツールバーのFile > Build Settings...からBuild Settingsを開く。
Player Settings...を押すとInspectorのウィンドウにPlayerSettingsが表示される。
Other SettingsのGraphics APIのチェックを外し、OpenGLCoreのみを選択。
Windowsの場合。Android,iOSは別の設定がありました。PDFをご覧ください。
f:id:nanokanato:20170417102956p:plain:w300

そしてPDFによるとこの設定を行った場合OpenGLモードは必要ないそうです!
なのでOpenGLモードのためにやったこと(上記,引用文の作業)は戻しました...

Editorでの再生にはUnity Proライセンス必須

そしてPDFには続きでこんなことが...
「Unity Editor 上で実行するには Unity Pro ライセンスが必須です。」

Proライセンスを持っていないのでビルドするとエラーがたくさん出てきます。

Xcodeにいきなり吐き出してビルド

Editorで動作できないのでiOS向けに書き出して動作確認したいと思います。
iOS,Androidでの動作にはUnity Proライセンスが必須と書いていないためです。
Xcodeに書き出すだけなのでWindowsからまたMacへ戻ってきました...

sceneをビルドしてXcodeで実行したらカメラの許可などを求められてそのままエラーが出ます。
f:id:nanokanato:20170417103127p:plain:w300

エラーの箇所のソースを見るとライセンスキーを入れろという内容っぽい。ですよね。
SmartARSDK-Overview_j.pdfの7Pにはライセンスのことが書いてあるがUnity向けの説明はない??

SmartARSDK-Overview_j.pdf(7P)ライセンス認証について
SmartARTM SDKはライセンス認証を行います。
ライセンスファイルを、Androidの場合はassetsフォルダ以下に配置、iOSの場合はプロジェクトに追加して、アプリケーションのリソースとして含まれるようにし、SarSmartの初期化時にファイルパスを指定することで認証を行うことができます。
ライセンスが認証されていない状態でもSmartARTMを使用することが出来ますが、以下の機能が制限されます。
SarCameraDeviceから取得した以外の画像を認識処理に渡すことができません
SarCameraDeviceから取得したカメラ画像を描画するためにはSarCameraImageDrawerを使用する
必要があります
カメラ画像描画にはWatermarkが付与されます
ライブラリの画像キャプチャ機能を使用してカメラ画像を取得することができません
具体的なAPIの使用制限については「SmartARSDK-Reference_j.pdf」を参照して下さい。
サンプルプログラムではライセンスファイルとしてlicense.sigというファイルをリソースとして持ち、ライセンス認証を行っています。(ダミーファイルのため、実際には認証処理に失敗します。)
SarSmartの初期化処理は SDK/Sample/mobile_common/sample_simple/sample_simple.ccの初期化部分を参考にすることが出来ます。

実際UnityのパッケージでImportした内容にはlicense.sigなんてものはない。

そこで、iOSSDKのサンプルを解凍して見てみるとlicense.sigというファイルがありました。
license.sigを「Assets/StreamingAssets/」に追加し、SmartAR CameraのGameObjectに追加されているSmartARController.csのLicense File Nameに「license.sig」と追加してみました。
f:id:nanokanato:20170417103343p:plain:w300

これでエラーが解決しました。
ただし、PDFにもあるようにライセンスの認証に失敗しているのでビルド時にSmartARのロゴは表示されます。

サンプルの再生

上のいろいろなエラーなどを乗り越えXcodeから実機にビルドできましたので動作の紹介。

起動時カメラ認証を求められてカメラの画面が表示されます。
f:id:nanokanato:20170417103459p:plain:w300

左下のResetでカメラのリセットです。ARマーカーや特徴点を再度読み込みなおします。
右下のMenuで画面中央にMenuが出てきます。
f:id:nanokanato:20170417103524p:plain:w300

iOSSDKに入っていたARマーカー「Sample/ios/target_picture/smartar02.png」を撮影すると綺麗に重なるようにオブジェクトが配置されました。
f:id:nanokanato:20170417103602p:plain:w300

ある程度マーカーが画面外になったりしても一度認識すれば補完してくれるみたいで、追従性がありました。
iOSのサンプルにはARマーカー以外にも特徴点のみから表示する3D空間認識ARのサンプルがあったのですがUnity版のサンプルにはないみたいです。(引き続き調査中)