Oculus Quest で VRTK を使う

# はじめに

Oculus quest開発するため、VRTKのドキュメントを見ながら作ったメモです

### 環境

* Unity 2019.3.0a7
* VRTK v4 beta

### 事前準備
* UnityでQuest用のビルドができること

* Oculus Integration Assetsを追加していること
(https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022)

* VRTKをクローンしていること
(https://github.com/ExtendRealityLtd/VRTK.git)

# 目次

1. CameraRig
2. コントローラアクション
3. ポインタ
4. 移動(テレポート)
5. 操作(インタラクティブ)

# 1. CameraRig

### 1-1. OVRCameraRigを追加

Oculus > VR > Prefabs > OVRCameraRig をHierarchyに追加
(最初にあったMainCameraは削除しておく)

Tracking Origin Type : Floor Level

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/d15591d0-afc3-926c-7a42-5c3129963a05.png)

OVRCameraRig に Linked Alias Association Collection(Component) を追加

PlayArea: OVRCameraRig
Headset: OVRCameraRig > TrackingSpace > CenterEyeAnchor
Headset Camera: OVRCameraRig > TrackingSpace > CenterEyeAnchor
Left Controller: OVRCameraRig > TrackingSpace > LeftHandAnchor
Right Controller: OVRCameraRig > TrackingSpace > RightHandAnchor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/c9574f1c-db6a-c3f1-2201-26805fca25bf.png)


### 1-2. TrackedAliasを追加

VRTK > Prefabs > CameraRig > TrackedAlias > TrackedAlias をHierarchyに追加

Tracked Alias Facade の Camera Rigs -> Elements -> Size を 1にして OVRCameraRig を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/dfb66176-5f15-68d7-881b-3a11dadec046.png)

HeadsetAlias に collider の Empty Game Objectを配置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/66534633-3d77-c9e3-8cf3-c01448d7a404.png)

HeadsetAlias,LeftControllerAlias,RightControllerAliasに
頭とコントローラオブジェクトを配置するとそれぞれ追従する


# 2. コントローラアクション

### 2-1. Unityボタンアクションの追加

VRTK > Prefabs > CameraRig > UnityXRCameraRig > InputMappings にあるControllerをHierarchyに追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/327396ac-d15f-9dcb-784a-62250db4e254.png)

* Activation State Changed: アクションのアクティブ化状態が前の状態から変更されたとき
* Activated: ボタンが押されたとき
* Value Changed: ボタンの値の状態が変更されたとき
* Deactivated: ボタンが離されたとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/a2b0b80f-5a34-a8a0-7a85-4458b5a099c4.png)

#### UnityXR.Oculus.RightController

* ButtonOne: A
* ButtonTwo: B
* ThumbReset: なし
* ThumbStick: ジョイスティック
* IndexTrigger: トリガー

#### Oculus Quest コントローラ

https://docs.unity3d.com/ja/current/Manual/OpenVRControllers.html

* [R]

| Oculus Touch               | map                          | Button ID | Axis ID |
| -------------------------- | ---------------------------- | --------- | ------- |
| Aボタン                    | Button.One                   | 0         |         |
| Bボタン                    | Button.Two                   | 1         |         |
| ジョイスティック(水平移動) | Axis2D.SecondaryThumbstick   |           | 4       |
| ジョイスティック(垂直移動) | Axis2D.SecondaryThumbstick   |           | 5       |
| ジョイスティック(押す)     | Button.SecondaryThumbstick   | 9         |         |
| ジョイスティック(接触)     | Button.SecondaryThumbstick   | 17        |         |
| トリガーボタン(接触)       | Axis1D.SecondaryIndexTrigger | 15        |         |
| トリガーボタン(握る)       | Axis1D.SecondaryIndexTrigger |           | 10      |
| グリップボタン             | Axis1D.SecondaryHandTrigger  |           | 12      |

* [L]

| Oculus Touch               | map                        | Unity Button ID | Unity Axis ID |
| -------------------------- | ---------------------------- | --------- | ------- |
| Xボタン                    | Button.Three               | 2               |               |
| Yボタン                    | Button.Four                | 3               |               |
| ジョイスティック(水平移動) | Axis2D.PrimaryThumbstick   |                 | 1             |
| ジョイスティック(垂直移動) | Axis2D.PrimaryThumbstick   |                 | 2             |
| ジョイスティック(押す)     | Button.PrimaryThumbstick   | 8               |               |
| ジョイスティック(接触)     | Button.PrimaryThumbstick   | 16              |               |
| トリガーボタン(接触)       | Axis1D.PrimaryIndexTrigger | 14              |               |
| トリガーボタン(握る)       | Axis1D.PrimaryIndexTrigger |                 | 9             |
| グリップボタン             | Axis1D.PrimaryHandTrigger  |                 | 11            |

### 2-2. Unity Axisアクションの追加

Axis Nameを Edit > Project Settings > Input Manager > Axes から確認

```
VRTK_Axis4_RightHorizontal
VRTK_Axis5_RightVertical
VRTK_Axis10_RightTrigger
VRTK_Axis12_RightGrip

VRTK_Axis9_LeftTrigger
VRTK_Axis11_LeftGrip
```

RightTriggerAxis(GameObject) に Unity Axis 1D Action(Component) を追加

* Activation State Changed: アクションのアクティブ化状態が前の状態から変更されたとき
* Activated: 軸の値が設定されたデフォルト値ではなくなったとき
* Value Changed: 軸の値が変更されたとき
* Deactivated: 軸の値が設定されたデフォルト値に戻ったとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/d6d93676-a455-222b-26a7-ee415485ed50.png)

### 2-3. FloatからBoolアクションへの変換

Unity AxisはFloatになっているので、使いやすいようにBool変換する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/1b5d0843-6d29-ee1c-63ac-c7e08239f3cc.png)

RightTriggerPressed(GameObject) に
Float To Boolean(Component) を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/57ee58cf-8986-687a-7759-f438dd5266cf.png)

Unity 1D Axis Action の Value Changed で RightTriggerPressed を選択し
FloatToBoolean -> DoTransform を選択

RightTriggerPressed(GameObject) に
Boolean Action(Component) を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/82ff5061-80fa-9619-1b33-55143232d3f5.png)


# 3. ポインタの追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/5deab99d-e98a-0750-80d4-d553bcd69f01.png)

### 3-1. 直線ポインターの追加

VRTK > Prefabs > Pointers > ObjectPointer.Straight

Follow Source: TrackedAlias -> Aliases -> RightControllerAlias
Activation Action：UnityXR.OpenVR.RightController -> Trackpad -> Touch[17]

### 3-2. 曲線ポインターの追加

VRTK > Prefabs > Pointers > ObjectPointer.Curved

Follow Source: TrackedAlias -> Aliases -> RightControllerAlias


# 4. 移動(テレポート)

VRTK > Prefabs > Locomotion > Teleporters > Teleporter.Instant をHierarchyに追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/eff16902-4750-7d13-a376-984c9c5ccafc.png)

Target: TrackedAlias -> PlayAreaAlias ※Headsetではない
Offset: TrackAlias -> HeadsetAlias
Camera Validity: TrackedAlias -> SceneCameras

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/6427a2bc-630d-6b2d-036b-35b5e9524357.png)

ObjectPointer.Curved
Activation Action: Touch[17]
Selection Action: Press[9]
Selected: Teleporter.Instant選択, TeleporterFacade -> Teleport(Dynamic EventData-Teleport)選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/cfe11eba-cd7c-fec6-8ac5-767e42551f2b.png)

# 5. 操作(インタラクティブ)

### 5-1. インタラクターを追加する

VRTK > Prefabs > Interactions > Interactors > Interactor をHierarchyに追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/0273e60f-0fb3-a312-9109-802e06c3b8a5.png)

LeftControllerAlias と RightControllerAlias に追加

Grab Action: GripPressed
Velocity Tracker: TrackedAlias -> Aliases -> RightControllerAlia

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/98878e69-dcf6-a74b-b954-a91b1afd8d96.png)

### 5-2. 操作できるprefabs

VRTK > Prefabs > Interactions > Interactables をHierarchyに追加

掴めるキューブ
Interactable.Primary_Grab.Secondary_Swap

# 参考

VRTK Academy
https://academy.vrtk.io/