iPhone12ProのLiDARセンサーとARKit4をUnity+AR Foundation4.1で遊ぶ【オクルージョン編】


# はじめに
昨年11月にLiDARセンサーで遊ぶためにiPhone12Proを買ったところ、既成アプリで遊ぶだけでなく自分でも触りたくなってしまったのと、ちょっとお得に買えるツテもあったのでMacBook Air M1を買いました。
iOSビルドするのにMacが必要だったので。
それで、先週末そのMacBookが届いたので、早速ARKit4で遊んでみました。そんな日記です。

自動環境オクルージョンといって、現実の部屋に仮想のオブジェクトを配置した映像を写したときに、現実の部屋の手前にある物体が、仮想オブジェクトよりもちゃんと手前に表示されるという機能ができるようになりました。
詳しい説明はこちら：
　[AR Foundation support for ARKit 4 DepthAR Foundation が ARKit 4 の深度検出をサポート - Unity Technologies Blog](https://blogs.unity3d.com/jp/2020/06/24/ar-foundation-support-for-arkit-4-depth/)

今回は、これをやっていきたいと思います。

# 環境
- iPhone 12 Pro
    - iOS 14.4
- MacBook Air (M1, 2020)
    - macOS Big Sur 11.2.1
- Unity Hub 2.4.2
- Unity 2019.4.20f1
- Xcode 12.4

# Unityプロジェクトの準備
## Unity Hubでプロジェクトを作成する

1. Unity Hubを起動し、「新規作成」をクリック
2. テンプレートは「3D」を選択し、プロジェクト名を適当に決めて「作成」をクリック<br>
    （今回は `ARkit4Occlusion` とします）（画像のスペルミスは気にしないように）<br>
<img alt="スクリーンショット 2021-02-14 21.50.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/06e76699-a4e8-28ae-d31e-154ad17d468c.png" width="400" >
<img alt="スクリーンショット 2021-02-14 21.50.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/40f770cc-c493-323b-4b54-e9c211a8d64d.png" width="400" >

## Unity上でのiOSプロジェクトの初期設定
1. プラットフォームを変更する
2. メニューバーから「File」→「Build Settings」→Platformで「iOS」を選択し、「Switch Platform」を押下<br>
<img alt="スクリーンショット 2021-02-14 21.53.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/be1f92bc-1588-2391-d5ab-951f52966395.png" width="300" > <img alt="スクリーンショット 2021-02-14 21.53.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/10417f63-f35e-2712-2cf8-6f5f585db305.png" width="450" >

3. メニューバーから「Window」→「Package Manager」→「Advanced」から「Show preview package」をクリック<br>
<img alt="スクリーンショット 2021-02-14 21.58.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/f077a6fd-7b5d-9e1c-9463-6c4ea29803ac.png" width="200" > <img alt="スクリーンショット 2021-02-14 21.59.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/c063fa9b-127c-24e8-b194-41ec72191cf2.png" width="400" >

5. AR Foundation 4.1.5を選択し、「Install」ボタンをクリック<br>
<img alt="スクリーンショット 2021-02-14 21.59.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/48a139af-d08a-bf7f-3271-14d68d345bfb.png" width="400" >

6. ARKit XR Pluginを選択し、「Install」ボタンをクリック<br>
 <img alt="スクリーンショット 2021-02-14 22.03.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/99f81f06-bd94-e9aa-cf59-6835faf437ba.png" width="400" >

1. メニューバーから「File」→「Project Settings」→「Player」→「iOS」→「Other Settings」と選択し、以下の３項目を設定する。
    2. Camera Usage Descriptionに、「AR機能にカメラを使用します」（実機でカメラを有効にする際にユーザーに表示されるメッセージです）
    3. Target minimumu iOS Versionに、「12.0」と入力
    4. Architectureで、「ARM64」を選択<br>
<img alt="スクリーンショット 2021-02-14 22.13.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/39e3dc5f-f3c3-da3a-7140-0f2db4097f57.png" width="200" >
<img alt="スクリーンショット 2021-02-14 22.14.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/69194dca-fe92-4dcc-b21e-949ac8a12823.png" width="400" >
<img alt="スクリーンショット 2021-02-14 22.14.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/fed3f0c5-38b3-45c9-f7d3-378b44c38c55.png" width="400" >

1. 同じダイアログの左側のメニューから「XR Plug-in Management」を選択し、「ARKit」をチェック<br>
<img alt="スクリーンショット 2021-02-14 22.15.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/50a3c66d-87c1-8c0a-5791-7bbbe3adcdd7.png" width="400" >

## AR Foundationの基本設定
1. Hierarchyから「Main Camera」を削除する<br>
<img alt="スクリーンショット 2021-02-14 22.15.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/421274e6-c91b-a04c-0db0-1e16ba261ce2.png" width="400" >

2. メニューバーから「GameObject」→「XR」→「AR Session」とクリックして、AR Sessionオブジェクトを追加<br>
<img alt="スクリーンショット 2021-02-14 22.16.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/6f40439e-539b-1d50-5a84-6bf501a66ed4.png" width="400" >

3. 同様に「GameObject」→「XR」→「AR Session Origin」とクリックして、AR Session Originオブジェクトを追加<br>
<img alt="スクリーンショット 2021-02-14 22.19.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/b53c9ca8-82f6-0ae5-2c35-b086ac759ca9.png" width="400" >

4. AR Session Originを右クリック→「3D Object」→「Cube」とクリックして、AR Session Originの子としてCubeを追加。
  （このCubeがARで映し出され、オクルージョンで隠れるものになります。Cubeじゃなくて好きなオブジェクトでも可。）<br>
<img alt="スクリーンショット 2021-02-14 22.22.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/581f68fc-d598-f628-dff5-481c8129f882.png" width="400" >

5. InspectorのTransformのScaleの値をすべて「0.1」にする。（Cubeの大きさで、単位はメートル。お好みで変更可）<br>
<img alt="スクリーンショット 2021-02-14 22.23.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/2f4451d3-a014-b8ff-8167-22b9e670345a.png" width="400" >


# 環境オクルージョンを使う
ARで表示させた仮想物体より手前にある現実の物体を優先して表示させる設定をします。

## AROcclusionManagerコンポーネントの追加
1. Hierarchyから、AR Session Originの子にあるAR Cameraをクリック
<img alt="スクリーンショット 2021-02-16 0.38.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/b69e2383-4d8d-5750-7656-37e0e484cbbe.png" width="300">

2. Inspectorから、「Add Component」をクリック
<img alt="スクリーンショット 2021-02-14 22.34.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/fff654b4-64d3-7442-3b9c-84c17435631e.png" width="400" >

3. 「AR Occlusion Manager」をクリックして追加する
<img alt="スクリーンショット 2021-02-14 22.34.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/2c7478c0-0eee-1fbd-cc29-dd9e60292fef.png" width="400" >

4. 「Environment Depth Mode」、「Human Segmentation Stencil Mode」、「Human Segmantation Depth Mode」をすべて「Best」に変更する
<img alt="スクリーンショット 2021-02-14 22.51.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/46df8405-c0d1-b6ab-44d5-72b12aa8e592.png" width="400" >


# プロジェクトをビルドして実行する
## Unity側での作業
1. メニューバーから「File」→「Build Settings」

<img alt="スクリーンショット 2021-02-14 22.59.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/af524f72-c00e-928f-9a96-43de9646adf8.png" width="200" >

2. 「Add Open Scenes」をクリックする。シーンが追加されたことを確認する
3. 「Build And Run」ボタンをクリック
<img alt="スクリーンショット 2021-02-14 23.00.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/b3bc9b0c-94d9-00db-4d20-eaabedda8f82.png" width="400" >
4. ビルドする名称を聞かれるので、わかりやすい名称を入力する
<img alt="スクリーンショット 2021-02-14 23.00.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/7dd30b56-1e9a-938c-16a0-c72c9189f0e5.png" width="400" >



## Xcode側での作業
1. 左のメニューの「Unity-iPhone」をクリック
2. 中央の「Signing & Capabilities」タブをクリック
3. 「Automatically manage signing」にチェックを入れる
<img alt="スクリーンショット 2021-02-14 23.06.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/a41e68b2-cdfb-2d8a-f086-cb7e17a9dd48.png" width="600" >

4. 確認ダイアログが表示されるので「Enable Automatic」をクリック
<img alt="スクリーンショット 2021-02-14 23.06.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/d8f9bc8f-0a25-9b68-540c-5df9d0906ed0.png" width="400" >

5. Team欄で自分のアカウントを選択する。（初めての人は「Add an Account...」から自分のAppleアカウントを追加する）
<img alt="スクリーンショット 2021-02-14 23.07.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/5c7b2d94-7eeb-7a11-db56-a3dacf76cfcc.png" width="400" >

6. 上部の「Any iOS Device (arm64)」をクリックし、自分のiPhoneを選択する。
    ※自分のiPhoneをMacに有線接続しておく。ちなみに、初めに設定をすれば以後は有線接続しておく必要はない（参考リンク）
<img alt="スクリーンショット 2021-02-14 23.12.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/8f3cde73-5c26-88fe-7c0b-ac820a170695.png" width="400" > <img alt="スクリーンショット 2021-02-14 23.12.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/070856bf-5722-a175-04c5-7874ad291d69.png" width="400" >

1. 画面左上の実行ボタン▶️をクリック
<img alt="スクリーンショット 2021-02-14 23.22.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/abe29748-3e99-1ff2-678e-7893841a7dde.png" width="400" >

1. iPhoneのロックを解除するメッセージが表示されたら適宜解除する
<img alt="スクリーンショット 2021-02-14 23.54.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/5c305b54-698d-beaa-e5bb-605d4dc066b3.png" width="400" >


## iPhone実機で動作確認する
正常にビルドされると、自動的にiPhone側でアプリが起動します。
起動時にiPhoneがあった現実空間の座標にCubeが作成されています。
椅子や自分の手にオクルージョンされて、Cubeが隠れて表示されることが確認できます。
楽しい！
<img alt="IMG_7169.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/bc784335-eec0-bd13-28d5-8904e4db224d.png" width="200" > <img alt="IMG_7170.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/496feb54-97b8-632a-51c7-30ceadec65fb.png" width="200" >

Cubeではなく他のオブジェクトを配置してみる。例えばストカジちゃんを配置することで、ナデナデできてよいです。
<img alt="IMG_7172.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/99d1a8bd-8187-17ba-b828-99830ddff4f4.png" width="200">


# 所感
AR Occlusion Managerの設定をすべてBestに設定したので、CPUに負荷をかけてでもオクルージョンの精度を優先しているはずなのですが、想像していたよりも精度良くはありませんでした。
角が丸いものに対しては深度が正しく取得しづらいのか、指や椅子のフチよりもCubeが優先して表示されていることがわかります。
かなしい。今後の改善に期待。

VRと違って、好きなアバターを自分の部屋に配置して自分の手で干渉できる！！とも思ったのですが、やはり没入感がないと言うか、スマホの画面越しだと「目の前にいる」感が薄いのも残念。
衝突判定持たせて動かせるようにすればちょっとは変わるかなあ？

それから、実際に動かして初めて気付いたことがひとつ。
部屋の奥行きがあると、カメラの手前に仮想オブジェクトを配置していても、カメラ自体は奥の背景にピントが合っているという状態になります。
もちろん仮想オブジェクトもピンぼけはしないのですが、その状態で例えば自分の手を出したりすると、自分の手だけがピンぼけしてることがあります。
<img alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33728/1d23fc76-9c72-1a2b-f206-a97c4768d4f1.png" width="400">
すっごい違和感。
今後のxRでは、アプリで演算した仮想オブジェクトの距離に合わせて、アプリからカメラのピントを調整する仕組みが必要になるのかも。
それと同時に、ARでよくある、ARマーカーを読むと起動する仕組みっていうのはこの問題が発生しづらい、よくできた仕組みだなあと思いました。

# さいごに
今回はオクルージョンの機能を触りましたが、ARKit4の目玉のもう一つにボディトラッキング（モーションキャプチャ）があるので、こっちも触ってみようと思います。
トラッカーなしでフルトラを目指して！

# 参考にしたサイト
- [AR Foundation 4.0 入門｜npaka｜note](https://note.com/npaka/n/nc24ba42aa710#yvbxK)
- [AR Foundation support for ARKit 4 DepthAR Foundation が ARKit 4 の深度検出をサポート - Unity Technologies Blog](https://blogs.unity3d.com/jp/2020/06/24/ar-foundation-support-for-arkit-4-depth/)
- [Unity - Environmental Occlusion and Depth in ARFoundation - Unity Forum](https://forum.unity.com/threads/environmental-occlusion-and-depth-in-arfoundation.919076/?_ga=2.105714183.581386269.1613302883-1446753362.1610851930)