【雑検証】UnityでObject TrackingとImage Trackingを比較してみた

## 概要
Unityで平面検出をしたら、俄然「バーチャル空間に現実のオブジェクトを表示し、位置・動きを同期させる」方法が気になりました。
そこで、現実のオブジェクトを検出するマーカーとしてオブジェクトそのものと2D画像の両者を比較するため、AR Tracked Object ManagerとAR Tracked Image Managerを試しました。

## 環境・ツール等
マシン
- Mac mini 2023 (チップ：Apple M2 Pro, OS: Sonoma 14.6.1)
- iPhone 14 (iOS: バージョン 18.0)

ツール
- Unity 2022.3.47f1
- AR Foundation 5.1.5
- Apple ARKit XR Plugin 5.1.5
- OpenXR Plugin 1.12.0
- XCode 16.0

## アプリ作成手順
### 基本設定
1. 以下の記事の「アプリ作成手順 1.Unityプロジェクトのセットアップ〜2.必要なパッケージのインストール」までを順に実行します
[平面を検出してオブジェクトを置けるARアプリをUnityで作る](https://qiita.com/MokonaSato/items/19eb9aa20958c5f9e2b6)

2. XR Originのセットアップ
    - デフォルトでシーンに追加されている「Main Camera」「Directional Light」を削除（画面左上の「Hierarchy」メニュー内に並んでいます）
    - 「GameObject > XR > XR Origin (AR)」を選択してシーンに追加
    - 「GameObject > XR > AR Session」を選択してシーンに追加

### 対象オブジェクトをスキャンする
1. 以下のページからAR Kitの3Dスキャナープロジェクトをダウンロードします
[Scanning and detecting 3D objects | Apple Developer Documentation](https://developer.apple.com/documentation/arkit/arkit_in_ios/content_anchors/scanning_and_detecting_3d_objects)
2. ダウンロードしたzipファイルを適当なディレクトリで解凍し、「ScanningApp.xcodeproj」をダブルクリックしてXcodeを開きます
![Scanner_Project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/43f1aa8f-11e1-5b8f-4bc0-09a84a380a2b.png)
3. サイドバーでScannerAppを選択し、「Sigining & Capabilities」タブで「Automatically manage sigining」にチェックし、Teamに開発者アカウントを選択します
画面上部(赤枠)で自分のiPhoneを選択し、再生ボタン(赤枠)を押下して、自分のiPhoneにスキャナーアプリをダウンロードします
![Scanner_Building.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/2ec83cfe-af1d-ba24-9838-7f243b2f11da.png)
4. スキャナーアプリを使って、対象のオブジェクトをスキャンします
参考：[【ARKit】3Dオブジェクトをマーカーにする - おもちゃラボ](https://nn-hokuson.hatenablog.com/entry/2019/06/25/192111)
5. スキャンし終わったら「Share」ボタンでiPhoneローカル上にarobjectファイルを書き出し、その後AirDropでPCに転送します

### AR Object Trackを試す 
1. HierarchyビューでXR Originを選択し、Inspectorビューの「Add Component」から「AR Tracked Object Manager」を選択します
2. 「Project」ビューで右クリックし、「Create > XR > Reference Object Library」を選択します
3. 「Project」ビューにスキャンしたオブジェクトのarobjectファイルをドラッグ&ドロップします
4. 「Project」ビュー内の「Reference Object Library」を選択し、「Inspector」ビュー内の以下の項目を設定します
    - 「Name」に適当な名前を指定
    - 「Reference Object Assets」にスキャンしたオブジェクトのarobjectファイルをドラッグ&ドロップし、指定
![Reference_Object_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/e5468eff-a74a-fc35-7470-9f80ad98a670.png)

5. 以下の記事の「アプリ作成手順 4.平面検出とオブジェクト配置」の手順3. ~ 6.に従ってCubeのプレハブを作ります
[平面を検出してオブジェクトを置けるARアプリをUnityで作る](https://qiita.com/MokonaSato/items/19eb9aa20958c5f9e2b6)

6. 「Hierarchy」ビュー内の「XR Origin」を選択し、「Inspector」ビュー内の「AR Object Tracked Manager」の以下の項目を設定します
    - 「Serialized Library」に「Reference Object Library」を指定
    - 「Tracked Object Prefab」に対象オブジェクトを検出した際に表示する「Cube」プレハブを指定
![AR_Tracked_Object_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/bea5f196-e0d1-f864-284d-b5d2e581d562.png)

7. 以下の記事の「アプリ作成手順 5.ビルド設定とiPhoneでの動作確認」に従ってビルドし、iPhoneを用いてテストする
[平面を検出してオブジェクトを置けるARアプリをUnityで作る](https://qiita.com/MokonaSato/items/19eb9aa20958c5f9e2b6)

## AR Tracked Image Managerを試す
※横着なので、AR Tracked Object Managerの検証後、XR OriginからAR Tracked Object Managerを削除した状態から作成しました。
1. HierarchyビューでXR Originを選択し、Inspectorビューの「Add Component」から「AR Tracked Image Manager」を選択します
2. 「Project」ビューで右クリックし、「Create > XR > Reference Image Library」を選択します
3. 「Project」ビューに対象の2D画像ファイルをドラッグ&ドロップします
4. 「Project」ビュー内の「Reference Object Library」を選択し、「Inspector」ビューの「Name」に適当な名前を、「Specify Size」にチェックを入れ、「Physical Size (meters)」に印刷後の画像の大きさをメートル単位で設定します
![Reference_Image_Library.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/b43562f7-4285-d1c7-689e-22442bd3b9ba.png)

5. 以下の記事の「アプリ作成手順 4.平面検出とオブジェクト配置」の手順3. ~ 6.に従ってCubeのプレハブを作ります
[平面を検出してオブジェクトを置けるARアプリをUnityで作る](https://qiita.com/MokonaSato/items/19eb9aa20958c5f9e2b6)

6. 「Hierarchy」ビュー内の「XR Origin」を選択し、「Inspector」ビュー内の「AR Object Tracked Manager」の以下の項目を設定する
    - 「Serialized Library」に「Reference Object Library」を指定
    - 「Max Number of Moving Images」には検出する画像の枚数を指定
    - 「Tracked Image Prefab」には2D画像を検出した際に表示する「Cube」プレハブを指定
![AR_Tracked_Image_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/bc16ba39-3439-6e3c-9331-9f8a04c19669.png)

7. 以下の記事の「アプリ作成手順 5.ビルド設定とiPhoneでの動作確認」に従ってビルドし、iPhoneを用いてテストする
[平面を検出してオブジェクトを置けるARアプリをUnityで作る](https://qiita.com/MokonaSato/items/19eb9aa20958c5f9e2b6)

## 検証
### AR Tracked Object Manager
今回検証に用いたのはイルカのぬいぐるみです(江ノ島水族館で買った思い出の品です)。
![ScreenRecording_dolphin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/711c6a90-703c-c372-7ceb-8a33014c5e0a.gif)
イルカのぬいぐるみを検知してCubeも追尾しますが、動きは遅いです。
また、大きく動かすとうまく追尾してくれません。

### AR Tracked Image Manager
今回検証に用いた画像はさわらつきさんのKawaiiLogosの「React」です(ステッカーにさせていただき、iPhoneケースに入れて愛用しています)。
参考：[GitHub - SAWARATSUKI/KawaiiLogos](https://github.com/SAWARATSUKI/KawaiiLogos)

![ScreenRecording_image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/d3c913fe-0bde-2b9d-8943-c017e834d39b.gif)
ステッカーを検知し、ほぼラグなく追尾できています

では、このステッカーをグラスの底に貼ったら、追尾してくれるでしょうか？
![ScreenRecording_glass.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/82426296-391c-0dd0-f5e8-4c8d4e48ec85.gif)

グラスの動きはうまく追尾してくれません。

それならば、もっとステッカーがはっきりと見える、お菓子のトレーならどうでしょうか？(他にいいものはなかったのか...)
![ScreenRecording_tray.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/ac3e25ae-1c5a-6111-d5c8-94c8b4f22527.gif)
こちらはほぼラグなく追尾してくれました。
水平方向の動きだけではなく、上下の動きもしっかり追尾してくれます。

## 結論・感想
Apple ARKitの場合は、「バーチャル空間に現実のオブジェクトを表示し、位置・動きを同期させる」には、動かすもの(コップやスマホなど)の場合はAR Trakced Image Managerを用いた方が、よりリアルタイムな同期ができそうです。

しかし、検出できるオブジェクトは透明で、斜めから見ても画像が鮮明に、歪みなく見えている必要があり、すべてのオブジェクトを対象にできるわけではありません。

また、カメラに画像が見えなくなる角度ではオブジェクトを表示することができません。

ほぼ動かさないものの場合(机や置物など)の場合は、AR Tracked Object Managerを用いることで、幅広いケースでオブジェクトを検出することができそうです。

今回はバーチャル空間に表示するオブジェクトは、簡便に作れるCubeにしましたが、実際のオブジェクトをリアルに再現した3Dオブジェクトをプレハブ化して利用すれば、よりリアリティを感じられると思います。

また、まだ調査していませんが、Meta Quest 3で利用できるアプリではより高性能なObject Tracking機能を使用できるかもしれません。

引き続き、Unityでさまざまなことを試していきたいと思います。