Oculus Questでハンドトラッキングやら

#概要
この記事では、Oculus Questでハンドトラッキングを使えるようにするまでの手順を記載していきます。
またUnityのOculus Integrationも更新され、ハンドトラッキングに対応したため、その使い方についても記載していきます。
今まで、色々なヘッドマウントデバイスを用いて開発を行ってきましたが、コントローラーには不自由さを感じてしまうところがありました。慣れている人には問題ないのですが、初めての人に対してコントローラーの操作説明をするときは”トリガー"という言葉は通じないし、中には持ち方がわからない人さえいる。
そういう意味でも今回のハンドトラッキングによって操作性が改善されることが期待できると思います。
（著者は待てなかったためフライング気味にLeapmotionで遊んでました笑）

#環境
 + Windows10 Home
 + Oculus Quest
 + Unity 2019.2.6

#手順
Oculus Questでハンドトラッキングを使えるようになるまでの手順はざっくり下記のような感じです。

 1．Oculus Questのソフトウェアアップデート
 2．ハンドトラッキングの有効化
 3．自作アプリへの組み込み（Oculus Integrationの使い方）
 4．動作確認
 5．最後に

#Oculus Questのソフトウェアアップデート
Oculus Questでハンドトラッキングを行う場合は、Oculus Quest自体のソフトウェアのシステムバージョンを12以上にする必要があります。（Oculus Questがネットワークに接続されている場合は自動的にアップデートされる？）
現バージョンは 、「設定タブ」　→　「すべてを見る」　→　「情報」で確認することができます。もしバージョンが11以下の場合は、「情報」の「ソフトウェアのアップデート（一番上の段）」から手動でアップデートしてください。
※ソフトウェアのアップデートが表示されていない場合は再起動してください。

#ハンドトラッキングの有効化
これでハンドトラッキングを使える環境は整いました。次にハンドトラッキング機能を有効化する必要があります。
有効化は「設定タブ」　→　「すべてを見る」　→　「テスト機能」　→　「テスト機能」内のハンドトラッキングをオンにすることで設定可能です。

<img width="256" alt="021.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440432/d14a6758-c5d1-e720-9586-75ec3bae3149.jpeg">
コントローラーが消えた！！！　ゴクリ！！

手が出現しました。
すごいぬるぬる動く。これは感動！！

#自作アプリへの組み込み（Oculus Integrationの使い方）
Oculus Integrationも最新バージョンにする必要があります。
最新バージョンでない場合、Asset StoreからOculus Integrationをアップデートさせます。
###Sceneの設定
１．新しいプロジェクトとシーンを追加したら、Hierarchyのmain cameraを消します。
２．Projectの（Asset/Oculus/Prefabs/）のパス内に入っているOVRCameraRigをHierarchyにドラッグ＆ドロップします。そして追加したOVRCameraRigの内部のTrackingSpaceのさらに内部にあるLeftHandAnchorとRighthandAnchorにProjectの（Asset/Oculus/Prefabs/）のパス内に入っているOVRHandPrefabとOVRControllerPrefabをそれぞれ入れます。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440432/60401593-925b-36f1-4d15-c7ece4bf32ef.png)
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440432/c360eaef-2ed8-8b17-1bd5-c981a33d6254.png)

３．OVRCameraRigのInspector内のOVR Managerスクリプトを確認し以下のように変更します。
ーTarget DevicesのElement0をQuestに変更
ーInputのHandTrackingSupportをControllers And Handsに変更
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440432/21e29d37-9aaa-0f9c-0ced-2fc69bb318e6.png)

４．OVRCameraRig/TrackingSpace/LeftEyeAnchorのInspectorを確認する。TagがMainCameraになっているので、Untaggedに変更する。（ここがなぜMainCameraになっているのか不明）

５．OVRCameraRig/TrackingSpace/OVRHandPrefabのInspectorを以下のように変更します。
ーOVR HandスクリプトのHandTypeを左右で一致するものを選択する。
（LeftHandAnchor内のOVR Handなら"Hand Left"、RightHandAnchor内のOVR Handなら"Hand Right"）を、、、
ーOVR SkeletonスクリプトのHandTypeを左右で一致するものを選択する。
ーOVR MeshスクリプトのHandTypeを左右で一致するものを選択する。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440432/3947a2ec-bf0b-3dad-1b89-30b9ba936473.png)

これでシーンの設定は終了です。

###permissionの設定
ハンドトラッキングを行うために、AndroidManifestファイルを生成・編集する必要があります。

１、AndroidManifestファイルの生成
Oculus/Tools/create store-compatible AndroidManifest.xmlを選択します。

![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440432/9bf961c9-e790-fa2c-d453-ae1ee66a6401.png)
すると、以下の画像のようにAndroidManifest.xmlファイルが作成されます。
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440432/e154f8b1-9cdd-943b-ed8c-af07365ead2e.png)


２、許可コードの記述
生成したAndroidManifest.xmlファイルを適当なEditorで開き、以下の文を記述する。

```xml:AndroidManifest.xml

<uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" />
<uses-feature android:name="android.hardware.vr.headtracking" android:required="false" />
<uses-permission android:name="oculus.permission.handtracking" />

```

###ビルド
ビルドからOculus Questにアプリをデプロイするまでの流れは前記事に記述しているので、
下記を参照してください。
・[OculusQuestのアプリ制作やら](https://qiita.com/yamaTVR/items/9f1021a84e4b5679fdcc)

#動作確認
デプロイしたアプリを起動します。
特にトリガーや当たり判定の設定はしていないため、ただ手の形が動くだけ。
気になった点はアプリにした場合、アプリ起動する前に「手を使用」のモードにする必要がある。現状ハンドトラッキングからコントローラーへの切り替えは自動でやってくれるみたいだが、コントローラーからハンドトラッキングの切り替えは設定タブから切り替えるほかなさそう、、、なおして～

また、直近でLeapmotionを触る機会があったためそれと比較するが、Leapmotionに比べ検出するトラッキングスペースは広いように感じた。しかし逆に検出精度に関しては、何かものを持ったり、指同士が重なったりするだけで消えていたのでLeapmotionの方が高いと感じた。（検出はしているが、テクスチャーを消しているだけの可能性があるかも、、、ここは要チェック）もしVTuberなどで活用する場合は、ロストしたときの対処方は必須。あと指先がプルプルしそうｗｗ

#最後に
ハンドトラッキングに当たり判定を入れてボックスを持てるようにしてみた。
次は仮想キーボードでも作ってみようかなｗ
物理判定、、、なにそれおいしいの？？？