HoloLens 2でVuforiaを使い物体の移動に追従させる

# はじめに
HoloLens2を用いた物体検出をマーカーで実装しようと思い始めた．
結局うまくいっていないが，調べたことなどを記しておく．

:::note warn
動作確認できていない
:::


# 前提
### 環境
|    項目     |    値    |
|-------------|------------|
|OS            | Windows 11           |
|Unity     |2020.3.44f1, 2021.3f1|
|デバイス |HoloLens 2 |
|Visual Studio      | 2022|
|MRTK    | 2.8.3|
|Vufolia   |Vuforia Engine 10.19 |

# 手順
## 1. Vuforiaのセットアップ
* [Vuforia Developer Portal](https://developer.vuforia.com)にログインし，Target Managerへ移動し「Add Database」する．
* データの保存先を選択できるので今回は`Deevice`を選択する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/abc333bb-6c49-e751-d129-b3baaa9e97c8.png)

* Add Target から画像を追加．
* 今回はいらすとやで[ゴーグルの画像](https://www.irasutoya.com/2017/04/mr.html)をダウンロードした．
* 画像の例だとpngだが，透過画像だとエラーを出されるのでペイントアプリでjpgに変換した．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/28f4369d-1145-3c64-e329-61ac29351465.png)

* Licence Managerで`Get Basic`からライセンスを取得する．
* 今回は「HoloLesMarkerTest」という名前で作成した．
* 後で表示された文字列を使用する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/6aabbf25-9de7-0e5d-24b8-f87fbc7a0131.png)


## 2. Unity
### プロジェクトのセットアップ
* プロジェクトを作成．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/32571901-31ee-4ef5-6049-34e9994ce610.png)

* [Vuforia Engine](https://developer.vuforia.com/downloads/sdk), [MRTK](https://github.com/microsoft/MixedRealityToolkit-Unity/releases) からunitypackageをダウンロード
* `Assets / Immport Package / Custom Package... `からインポートする

### MRTK
* MRTKの画面が出たらApplyを押す．
* 画面はエディター上部の`Mixed Reality Toolkit / Utilities / Configure Unity Project`で出せる．
* Build Settings でPlatformを以下のように設定する．
* `error CS8124: Tuple must contain at least two elements.`が表示された場合は以下のように修正する．

```C#
public UnityEvent OnTargetFound = new();
public UnityEvent OnTargetLost = new();
```
↓
```C#
public UnityEvent OnTargetFound = new UnityEvent();
public UnityEvent OnTargetLost = new UnityEvent();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/6ce0d658-240d-6871-1a78-3158a7cf5494.png)

### Vuforia．
* メニューから`Window / Vuforia Configration`．
* 先ほど取得したライセンス文字列を入力する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/0f2fa1a9-5310-0b28-5316-e9869c87d632.png)

### 作りこみ
* `Mixed Reality Toolkit / Add to Scene And Configure..`
* Image Targetの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/675c344a-6e27-44c5-a843-dcae03f0f154.png)

* 以下のように設定．

|    項目     |    値    |
|-------------|------------|
|Type            | From Database           |
|Database      | 作成したデータベース|
|ImageTarget      | 作成したターゲット|

* パッケージをインポート．
* Target ManagerからDownload Databaseでダウンロードできる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/94e20665-5047-0014-c587-995feb68d69a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/d25ef890-bc7f-c259-273f-35ffd5a5cbd8.png)

* マーカー認識時に表示したいオブジェクトを作成し，Image Targetの子オブジェクトにする．

* MixedRealityPlayspaceの子にあるMain Cameraに以下のコンポーネントを追加．
* `Vuforia Behaviour`，`Default Initialization Error Handler`．

* PackageManagerから以下をインポート(Packages: Unity Registryにしないと表示されない)．
* `Windows XR Plugin`，`XR Plugin Management`．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/40417d2b-109b-dd77-60b3-2936c0e8b2cf.png)


* `Edit / Project Settings`から`XR Plug-in Management`の`Windows Mixed Reality`にチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/4d29fafe-ed11-2ed2-7081-515df67c192f.png)

* `Player Settings / Player / Publish Settings / Capbilities`のWebCamにチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/8f43d01c-9eea-d543-c75f-413ebacb617d.png)

### ビルド
* Add Open Scenesでシーンを追加．
* ビルドする．


## エラー解決
### ConsoleにMRTKのエラーが出ている場合
* MixedRealityToolkitオブジェクトでプロファイルのクローンを行う
* エラーが出ている個所のプロファイルをクローンする
* 赤い個所をTry Repairで解決する
* [IMixedRealityInputDeviceManager data providerのエラー](https://github.com/microsoft/MixedRealityToolkit-Unity/issues/9722)を参考にした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/a2aa3c48-106d-ef7e-ee9e-4b0923126ca8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/cd36cc2f-5d9e-ed2d-7f2b-09d3079ef0c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/8ab0edd3-d16f-5724-766c-c6cc64eb1c76.png)


### Refeence rewriter
* 以下のエラーが発生
```
Reference Rewriter found some errors while running with command "--target=Temp\StagingArea\Data\Managed\Microsoft.MixedReality.Toolkit.Async.dll"
```
```
Reference rewriter: Error: method `System.Boolean UnityEngine.Texture2D::Reinitialize(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean)` doesn't exist in target framework. It is referenced from Vuforia.Unity.Engine.dll at System.Void Vuforia.Image::ResizeTexture(UnityEngine.Texture2D,System.Int32,System.Int32,UnityEngine.TextureFormat).
```

* 無視してOK
* こちら](https://github.com/microsoft/MixedRealityToolkit-Unity/issues/8839)参考
* Build画面から直接ビルドできるRemote Deviceだとビルドできないが，Visal Studioでビルドできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849125/e9ab45f4-8059-1008-5c54-061aec19164c.png)

### アプリ起動後に落ちる
試したこと
* Open XRに切り替えたらビルドできた
* 白い画面がずっと表示される
* Windows Mixed Realityに戻す
* Build時のアーキテクチャをARM64に変更
* Visual StudioでARM64にしてビルド
* また落ちるようになる
* ログを見る
```
Windows Mixed Reality specific camera code has been moved into Windows Mixed Reality Camera Settings. Please ensure you have this added under your Camera System's Settings Providers, as this deprecated code path may be removed in a future update.
```
* [このサイト](https://localjoost.github.io/fixing-windows-mixed-reality-specific/)に行きつく．
* ログにエラーがないが落ちる．
* unityのversionを2021.3.33f1iに変えてみる．
* Assetsをreimport allする．
* プロジェクトの作り直し，バージョン変更など行ったが気づけば研究室に籠ること時刻は午前三時．
* 萎えたので帰ります．

### その他のエラー解決
* [UnityでHoloLens2アプリをデプロイする手順とよくあるトラブルのまとめ](https://note.com/yuujii/n/nf717fb9cc750)

# おわりに
他の人のプロジェクトをクローンするのが早いのかもしれません．
それをやっても自分の環境では正常に動作しませんでした．
多分どこか間違えているのだろうけど頭が回らないので別日にリトライします．

[動作確認プロジェクト](https://github.com/TakahiroMiyaura/VuforiaWithMRTKV2Samples)