【Unity】【AR】Unity2017.3+Vuforia7で水平面検知する

Unity2017.3が正式にリリースされまして、Vuforia7が搭載されました。
というわけで早速使ってみたので、実機で実行するまでを解説します。

Vuforia7の何がいいの?

というわけで、何が嬉しいかというと、Vuforia7にはGroundPlaneという、ようはARKitやARCoreで実現できるような水平面を検知する機能が搭載されています。
これによって、ARKitやARCoreそれぞれのSDKを自分で導入し、実行するプラットフォームごとに利用するコードを切り替えるという煩わしさから解放されます。

さらに、GroundPlaneは以下に記載されている通り、ARKitやARCoreよりも幅広いデバイスをサポート
Ground Plane Supported Devices

そしてさらに、VuforiaFusionという仕組みによってARKitやARCoreが利用できる環境ではそれを利用することで、環境ごとに最も良いAR体験を提供してくれるようです。
Vuforia Fusion

たとえば、UnityのARKitのプラグインを使った場合、iOS11以上、GPUはMetalに依存してしまうのが現状です。
しかし、Vuforiaの機能を使うことで上のリストにある幅広いデバイスに対応することが出来るようです。よさ。

導入

まずはUnity2017.3をダウンロードします。
Unity - Update

ちなみに現時点ではARKit搭載のiPhoneしかサポートしておらず、ARKit非搭載端末とAndroid対応版は来年1月にパッチリリース予定っぽいので、以下を監視しておきましょう。
Unity - Unity QA - Patch Releases

ここからは基本的に以下の手順に従う形になります。
Introduction to Ground Plane in Unity

次にインストールですが、Vuforiaの項目があるので忘れずにチェックしておきましょう。
f:id:tm8r:20171227132521p:plain

完了したら新規プロジェクトを作成し、File>Build SettingsでiOSかAndroidにSwitch Platformします。

次に同ウィンドウのPlayer Settingsを選択し、XR SettingsでVuforia Argumented Realityにチェックを入れます。
f:id:tm8r:20171227132612p:plain

iOSの場合、同InspectorのOther SettingsのCamera Usage Descriptionに適当に文字を入れておきます。
f:id:tm8r:20171227132938p:plain
さらに、Target minimum iOS Vertionを9.0にしておきます(もしかしたら来年リリースのパッチでここは少し変わるかも)。

Androidの場合、Android TV Compatibilityのチェックを外しておく必要があると思われます(今は意味ないですけど)。

これでとりあえず導入は完了です。

シーンのセットアップ

まずは新規シーンを適当な名前で保存します。

MainCameraを消して、Hierarchy上で右クリック、Vuforia>AR Cameraで専用のカメラを作成します。

次に、同じようにHierarchy上で右クリックし、Vuforia>Ground Plane>Ground Plane Stageで水平面を検知したときに表示される、Anchorの役割を果たすオブジェクトを作成します。

キャラなどを配置する際にここが基点となるので、表示したい任意のオブジェクトを、作成したGround Plane Stageの子供として作成しつつ位置合わせをします。
f:id:tm8r:20171227133609p:plain
こんなかんじ。

次にVuforia>Ground Plane>Plane Finderで水平面を検知するオブジェクトを作成し、このPlane FinderについているContent Positioning BehaviourのAnchor Stageに対して、先程作成したGround Plane Stageを指定してやります。
f:id:tm8r:20171227133850p:plain

これでとりあえず水平面を検知して、任意のオブジェクトを表示するという準備が整いました。ノンコーディング…!

エディタで実行してみる

そうです。エディタで実行できるんです。
iPhoneと繋いだりする必要もないんです。適当なWebCamera、つまりMacにデフォルトでついてるカメラでもいいんです。

とはいえ適当なカメラで実機同様に水平面検知できるわけではなく、このときだけマーカーが必要になります。
Assets>Editor>Vuforia>ForPrint>Emulatorの中にEmulator Ground Planeというpdfがあるので、こいつを印刷するなりスマホで開くなりすればおっけーです。
f:id:tm8r:20171227134508p:plain
らくちん。

ちなみに複数のカメラが接続されている場合、Assets>ResourcesにあるVuforiaConfigurationのWebcamという項目のCamera Deviceから利用するカメラを選択できます。
f:id:tm8r:20171227135236p:plain

タップでオブジェクト表示するようにする

このままだと検知した瞬間にオブジェクトが表示されてしまうので、タップしたタイミングで表示するように改良しましょう。

まず、Assets>ResourcesにあるVuforiaConfigurationのDevice Trackerという項目でTrack Device Poseにチェックを入れ、Tracking modeをPOSITIONALにします。
f:id:tm8r:20171227135102p:plain

次に、上でも書いた以下のチュートリアルにDeployStageOnceというクラスのコードがあるので、こいつを適当な場所に「DeployStageOnce.cs」として保存します。
Introduction to Ground Plane in Unity

そして、先程追加したPlane FinderのContent Positioning Behaviourを削除し、代わりにDeployStageOnceを追加、さらに同じようにAnchor Stageに対して、先程作成したGround Plane Stageを指定してやります。

ちなみにチュートリアルではここまでしか書いてないのですが、あともう一つ作業が必要です。

PlaneFinderのPlaneFinderBehaviourというコンポーネントのAdvancedをクリックして展開し、On Intaractive Hit Testという項目に自身を追加、先程追加したDeployStageOnceのOnInteractiveHitTestを指定してやることで正常に動くようになります。
f:id:tm8r:20171227135354p:plain

ビルドしてみる

ビルドに関してはそんなに詰まることがないというか、詰まるとしたらVuforiaとか関係ない詰まり方が多いかと思うんですが、一点ハマったので書いておきます。
iOSでビルドするときbundleIdentifierに「com.tm8r.vuforia」みたいなのを指定したときに、XCodeが以下のような感じのエラーを吐きました。

ld: can't open output file for writing: /Users/xxxxxx/Library/Developer/Xcode/DerivedData/Unity-iPhone-fqfjddrffxdlricyonokdawudsoe/Build/Products/ReleaseForRunning-iphoneos/Vuforia.app/Vuforia, errno=21 for architecture arm64clang: error: linker command failed with exit code 1 (use -v to see invocation)

なんぞこれーと頭を捻りつつぐぐると、同じ状況に陥ってる人がいるものの、特に解決してない模様。
Unity Build Issues | Vuforia Developer Portal

まさかなーと思いつつ「com.tm8r.vuforia」を「com.tm8r.vuf」にしたら無事ビルドが通りました。マジかよ。
この後また末尾vuforiaにして再現確認してないのでアレですが、同じ感じで詰まったらbundleIdentifierを変えてみるとよいかと思います。

あとついでに、ARKitのSDKを使う形でビルドするときはGraphics APIをMetalにしてたんですが、ためしにOpenGLES2にしてビルドしてみました。

結果は…

やったぜ。

検知も早いし、大きくブレたりもしないし、要件は十分に満たしてくれてるのではないでしょうか。

おわり

というわけで、最初に書いた通りデバイスのサポート対象は多いし、プラットフォームごとに書き分けの必要もないし、ちょっとしたARアプリを作る分にはよい選択肢じゃないかなと思います。
ただ、Vuforiaのライブラリが必要になる分アプリサイズは膨らむと思うので、そこは要件に合わせて検討が必要そう。
あとは来年リリースされるパッチでARKit非搭載端末とAndroidがどこまでのパフォーマンスを出せるかというところでしょうか。

さらに、Unity2018ではUnity単体でクロスプラットフォームのARが実現されるようなので、待てる人は待った方がよいかもですね。

スポンサーリンク