UnityでVIVE Hand Tracking SDKとDaydreamを組合せてみた

# はじめに

先日、VIVE Hand Tracking SDKがリリースされました。
これを使うとVIVE Pro / VIVE / VIVE Focus / Androidで両手の位置トラッキングとジェスチャー認識できます。
とは言え、トラッキングはデバイス毎にできる事が違います。

| デバイス | 2Dポインタ | 3Dポインタ  | スケルタル |
|----|----|----|----|
| VIVE Pro | o | o | o |
| VIVE | o | x | o |
| VIVE Focus | o | o | x |
| Android(Camera2 APIに対応したカメラ必須) | o | x | x |

VIVEは誰かやっていそうなのでAndroid(Daydream)と組合せてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">DaydreamViewとVive Hand Tracking SDKを組み合わせてみた。Daydreamだとジェスチャー認識と位置トラッキングがバッチリ動いた <a href="https://twitter.com/hashtag/unity?src=hash&amp;ref_src=twsrc%5Etfw">#unity</a> <a href="https://t.co/f5iuYPuTgX">pic.twitter.com/f5iuYPuTgX</a></p>&mdash; Mitsuhiro Koga (@shiena) <a href="https://twitter.com/shiena/status/1108001649866366977?ref_src=twsrc%5Etfw">March 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 試してみる 

## 開発環境

* Unity 2018.3.11f1
* gvr-unity-sdk v1.190.1
* VIVE Hand Tracking SDK 0.8.0

## サンプルシーン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/85948a60-aed6-462d-07ed-bc84982663b3.png)


[VIVE Hand Tracking SDK](https://developer.vive.com/resources/knowledgebase/vive-hand-tracking-sdk/)をダウンロードして展開すると以下のパッケージがあるのでインポートします。

* Hand Tracking SDK Unity.unitypackage
* Hand Tracking SDK Unity Sample.unitypackage

`/Assets/Aristo/Sample` に2つのシーンがあるので `Sample.unity` を開きます。もう1つの `Test_WaveVR.unity` はVive Focus用なので今回は使いません。

このシーンはスクリーンショットのように5種類(右上はGrabとPushの2つ)のサンプルが含まれています。
Androidは2Dポインタのみ対応なのでカメラにアタッチされている`Gesture Provider`のモードを`Point 2D`にすればこのまま改造できそうです。

## Daydreamと組合せる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/af931572-a673-ce15-d39f-1cb0b34e8bec.png)

1. [GVR SDK for Unity v1.190.1](https://github.com/googlevr/gvr-unity-sdk/releases/tag/v1.190.1)からパッケージをダウンロードしてインポートします。
2. スクリーンショットのようにシーンルートに4つのプレハブと`Main Camera`と同じ階層にプレハブを追加します。`Assets/GoogleVR/Demos/Scenes/HelloVR.unity`シーンからコピーすると簡単です。
3. `Player Settings` > `XRセッティング` > `VRサポート`をチェックします。
4. `Player Settings` > `XRセッティング` > `Virtual Reality SDK`に`Daydream`を追加します。
5. サンプルシーンにバグがあるので[フォーラム](https://community.viveport.com/t5/Vive-Hand-Tracking-SDK/Vive-Pro/td-p/29239?__woopraid=H4JPEg3iBbDa)を参考に修正する。

これをビルドすると冒頭の動画のように動作します。
今回はPixel3とDaydream Viewを使ったのですがカメラ必須なので前の蓋を開けたままにしてスマホはテープで留めています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">カメラが必要なので蓋を開けたままテープで強引に留めただけw <a href="https://t.co/kPHfB8r0aD">pic.twitter.com/kPHfB8r0aD</a></p>&mdash; Mitsuhiro Koga (@shiena) <a href="https://twitter.com/shiena/status/1108001669072089088?ref_src=twsrc%5Etfw">March 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現状ではMirage Soloで使えないのですがフロントカメラを扱えるようになるのでVIVE Hand Tracking SDKも今後のバージョンアップで対応してほしいところです。

### 追記

[GVR SDK for Unity v1.200.0](https://github.com/googlevr/gvr-unity-sdk/releases/tag/v1.200.0)でシースルモードに対応したのですが残念ながらカメラ画像を扱えないものでした。[issue](https://github.com/googlevr/gvr-unity-sdk/issues/988#issuecomment-479247636)では対応しないわけではないようなので今後に期待です。

# リンク

* [VIVE Hand Tracking SDK](https://developer.vive.com/resources/knowledgebase/vive-hand-tracking-sdk/)
* [Document](https://developer.viveport.com/documents/sdk/en/vivehandtracking_index.html)
* [サンプルシーンのエラー修正](https://community.viveport.com/t5/Vive-Hand-Tracking-SDK/Vive-Pro/td-p/29239?__woopraid=H4JPEg3iBbDa)