Vuforia EngineのArea Targetsを使ってみた

## まえがき

**Vuforia Engine**の**Area Targets**という機能を用いて、オフィスの共用部分をスキャンしてオブジェクトを表示してみました。

Area Targetsは、スキャンした空間全体をターゲットにすることができる機能です。

2020/7/11現在では、**Matterport Pro2**という3Dカメラでスキャンした空間のみターゲットにすることができます。

また、Matteport Pro2でスキャンしたデータをArea Targetsで利用するためには、**Matterport Pro Professional**(69ドル/月)と、スキャンデータをダウンロードするのに**Matter Pak**(Professional Planでは49ドル)が必要です。

また、Matterport側に**APIの利用申請**をメールで送っておく必要があります。

## 実行環境

- Unity 2019.3.0f3
- Matterport Pro2
- Vuforia Engine 9.0
- iPhone 11 Pro

## Vuforia Engineとは

Vuforia Engineは、iOSやAndroid、PC、HoloLensといったAR/MRデバイスに対応したAR開発プラットフォームです。

Vuforia EngineはPTCが提供していますが、元々はQualcommが開発しており、2015年にPTCがVuforia事業を6500万ドルで買収しています。

マーカートラッキングを非常に得意としており、特徴点の多い(複雑な)画像であればほとんどぶれることなく3Dオブジェクトを配置することができます。

詳しくはこちらをご覧ください！

<a href="https://qiita.com/kot10n5tn/items/b0cc615206e806dd2904">今一番ホットなARライブラリ「Vuforia」とは</a>

画像をターゲットにする**Image Targets**を使っていきたいと思います。

ライセンスの取得とライセンスキーをUnityに設定する方法関しては、<a href="https://qiita.com/kot10n5tn/items/757c093e9e556453caec">ラズパイ4をVuforia Engineで分身させてみた ~Object Recognition編~</a>こちらをご覧ください。

## Area Targetsとは

Image TargetsやModel Targetsは視界に捉えられる被写体に対するものに限られており、広い空間をトラッキングするために設計されたものではありません。

Area Targetsはスキャンした空間をトラッキング対象として、AR表現を行うことが可能になります。

<img width="375" alt="IMG_4271.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/5dafbf2f-1e19-1f21-41fb-a9c4622f76f3.png">

今回は、このようにオフィスの共用部をスキャンしてArea Targetsを使用してみました。

## スキャンからUnityで実行するまで

### Matterport Pro2による撮影

シェアオフィスの共用エリアを**Matterport Pro2**を用いて3Dスキャンしました。

画像のようにMatterport Pro2を設置します。

![IMG_2687.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/2501eb4f-c58b-e472-be98-21c790deec81.jpeg)

そして、iPhoneの<a href="https://apps.apple.com/jp/app/matterport-capture/id701086043">Matterport Capture</a>というアプリでスキャンを始めることができます。

実際に撮影している風景がこちらです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Matterport Pro2によるスキャン風景 <a href="https://t.co/a2fIDL7gwX">pic.twitter.com/a2fIDL7gwX</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1284983421266059265?ref_src=twsrc%5Etfw">July 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

60度ずつ回転してスキャンをしているようです。

実際に撮影する場合は、自分が写ったらダメなのでこのように物陰に隠れて撮影をします。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">物陰に隠れてMatterport Pro2で撮影 <a href="https://t.co/PhSKcJOfyL">pic.twitter.com/PhSKcJOfyL</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1288682638593556480?ref_src=twsrc%5Etfw">July 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

複数箇所スキャンすると、以下のようにアプリ上にスキャン結果が表示されます。

<img width="375" alt="IMG_030A6129B9D4-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/fc74f9b9-7494-7d30-9a15-9f8d35911897.jpeg">

公式では、2m間隔でスキャンすることが推奨されています。

窓の位置は、手動で設定をしました。

そうすることで窓ガラスの外を認識してしまった場合、不要な部分は削除することができます。

### スキャンデータをクラウドにアップロード

スキャンデータをMatterportのサーバーにアップロードすることで、スキャンデータを作成することができます。

ここで、Matteport Pro2で撮影したデータをアップロードする場合には、69ドル/月の**Professional Plan**に加入している必要があります。

アプリからアップロードすることができ、3-4時間でスキャンデータの作成が完了しました。

### スキャンデータをArea Targetsで利用できるようにする

スキャンデータをクラウドからダウンロードするには、49ドルが必要になります。(Matter Pak)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/e07e5b2a-db3b-ac6a-d431-750b0479356c.png)

Matter Pakの購入後、<a href="https://developer.vuforia.com/downloads/tool">Area Target Generator</a>を用いてスキャンデータをArea Targetsで利用できる形式に変換します。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3236343636362f36373331346530622d356236382d316339342d313939392d3235393536636462343734642e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/6c4d24dd-2d7a-14bc-c1f9-755eeac0c448.png)

MatterportにAPI利用申請のメールを送って承認されると、Tokenが取得できるのでそれを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/b891641f-57b5-fd24-7f87-66423c7b0ad3.png)

**Scanned Space**には、クラウド上のスキャンデータのIDを入力します。(どこにあるのかわからず、URLの???の部分を入力したらいけましたhttps://my.matterport.com/models/???)

すると**.unitypackage**ファイルを作成することができます。

### Area TargetsをUnityで使う

Unityでプロジェクトを作成した後、先ほどの**.unitypackage**を読み込みます。

すると、**Area Targets**を配置することができます。

あとは通常の開発同様、Area Targets配下にオブジェクトを配置していくといった流れです。

## Area Targetsを用いて実装

### 作成したもの

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Vuforia Area Targetsのデモ <a href="https://t.co/uAspSz4Al3">pic.twitter.com/uAspSz4Al3</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1284985410343460865?ref_src=twsrc%5Etfw">July 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 実装内容

- 室内の温度の表示

実際の気温とは関係なく、1秒おきに変化させています。

今回は行っていませんが、IoTデバイスと連携して、温度センサー情報を取得して表示をする想定です。

アニメーション付きで変化させてみると見栄えもよくなりそうだと感じました。

- 座席の予約切り替え

座席のエリアをタップすることで、**Available**と**Reserved**の切り替えをすることができます。

- プロジェクターの予約切り替え

プロジェクター横のレバーをタップして切り替えることで、プロジェクターの使用可否を切り替えることができます。

- 危険エリアの表示

**Danger**と表示されているエリアは侵入禁止エリアを想定しています。

- 目的地（プリンタ）へのナビゲーション

**Find Printer**ボタンを押すと、プリンタの位置を矢印が差してくれます。

Area Targetsによって、カメラがどちらの方向を向いているのかがわかるために実現できています。

ルートを指し示す場合は、通ることのできる道の定義、ルート探索のアルゴリズムを実装することで実現できます。

### オクルージョン

オクルージョンとは、現実世界の物体の奥に3Dオブジェクトが存在する場合に、重なっている3Dオブジェクトを表示しない機能です。

<img width="375" alt="IMG_4281.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/758171fe-7fd9-825a-175f-1dcfa0df2c0a.png">

こちらの画像のように、壁の奥のDangerの部分は隠れる機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/80dbfc30-dbba-9017-94b4-1b7b9134729c.png)

Area Targetsの**Simulate Occlusion**をオンにすると、オクルージョンされるようになります。

この場合のオクルージョンは、スキャン時に存在していた物体に対してのみ適用されます。

そのため、スキャン時に存在していなかった物体が存在していたり、スキャン時にあったものがなくなってしまった場合、少し違和感のあるオクルージョンが発生します。

スキャン時に存在していなかった物体が存在する場合は、その物体に対してのオクルージョンが行われません。

また、スキャン時にあったものがなくなってしまった場合は、スキャン時の位置に存在していた物体通りにオクルージョンが行われます。

なので、基本的には机など動く可能性のあるものはスキャンに含めない方がよいかと思います。

### Image Targetとの併用

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Vuforia Area TargetsとImage Targetsの併用 <a href="https://t.co/ut2PWUj5ga">pic.twitter.com/ut2PWUj5ga</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1288679782419316736?ref_src=twsrc%5Etfw">July 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

このように、Area Targetsを利用しているときに、別のTargetも使用することができます。

空間に配置するものはArea Targetsで、何か物体やマーカーに動的に追随するものはImage TargetsやModel Targetsを使うといったユースケースが考えられます。

## まとめ

**Vuforia Engine**の**Area Targets**は、精度よくオブジェクトを配置することができました。

**Area Targets**は、オフィスや、工場、美術館といった場所で、ゲームやナビゲーションを表示するのにとても有用であると感じました。

現状では、Matterport Pro2と月額69ドルが必要であるため試すのにもハードルがありますが、試す価値は十分にあると思います！

開発者向けのVuforia Slackコミュニティがあり、僕も参加しているので、記事の内容で質問があればそちらから質問下さい！

https://www.it-ex.com/promo/vuforia/to-developers/

また今回のコードはGithubに載せているので是非クローンしてお手元で試してみてください！

https://github.com/kot10n5tn/AreaTarget