UnityのUnityEngine.VRについて

#UnityEngine.VR

Unity内の`UnityEngine.VR`の名前空間にVRで使用するクラスなどが含まれています。
Oculus Utilities for Unity 5と違って特定のunitypackageをインポートする必要はありません。
ただしUnityのバージョンによって挙動が違う可能性があります。

この記事は以下のUnityのバージョンを使用しています。
~~Version 5.2.1~~
**Version 5.2.2**

|               |       |                                                                  |
|:--------------|:------|:-----------------------------------------------------------------|
| InputTracking | class | 接続しているVRデバイスの位置や向きの取得できます                      |
| VRDevice      | class | VRデバイスの接続の有無やデバイスの名前を取得できます                   |
| VRDeviceType  | enum  | OculusやMorpheusなどVRSettingsから取得できるデバイスの種類           |
| VRNode        | enum  | 左目や目の中央部分などInputTrackingから位置や向きを取得する際の位置種類 |
| VRSettings    | class | VRデバイスの使用有無やディスプレイへのミラーリングの有無を設定できます   |


####InputTracking
・`Vector3 GetLocalPosition( VRNode node )`
　VRデバイスの座標の位置を取得します。単位はメートル。
　引数のVRNodeで左右の目や目の中央を基準とした位置で取得できます(後述)。

・`Quaternion GetLocalRotation( VRNode node )`
　VRデバイスの向きを取得します。
　`GetLocalPosition()`同様、左右の目や目の中央を基準とした向きを取得できます(後述)。

・`void Recenter()`
　現在のポーズを中心にしてトラッキングを初期化します。
　Oculus Utilities for Unity 5を使う場合はOVRDisplayクラスの`RecenterPose()`が`Recenter()`を内包しているためそちらを使ったほうがいいかもしれません。

:neutral_face:**Recenter()は全てを初期化するわけではないのです**
　`Recenter()`後に`GetLocalPosition()`を呼ぶと、Recenter()を呼んだ際の位置が(0, 0, 0)となって計算されますが、
　`GetLocalRotation()`で取得する回転角度はY軸回転のみが0度になります。
　すごく傾いた状態で`Recenter()`を呼んでもX軸、Z軸の回転は初期化されません。

####VRDevice
・`string family`
　ロードされた VR デバイスのファミリー名。
　Oculus Rift DK2を接続した場合には**"oculus"**。
　何も接続していない場合には**"none"**の文字列が取得できました。

・`bool isPresent`
　VRデバイスの接続の有無が取得できます。
　
・`string model`
　ロードされた VR デバイスの特定のモデル名。
　Oculus Rift DK2を接続した場合には**"Oculus Rift DK2"**。
　何も接続していない場合には空の文字列が取得できました。

・`IntPtr GetNativePtr()`
　VR デバイスのネイティブ ポインタ を取得します。
　……とのことですが、詳しく調べきれていないのでよくわかりません。

####VRDeviceType
　VRSettingsクラスのloadedDeviceプロパティにて取得できるVRデバイスの種類。
・`None`
・`Stereo`
・`Split`
・`Oculus`
・`Morpheus`

####VRNode
　VRDeviceクラスの`GetLocalPosition()`、`GetLocalRotation()`を呼ぶ際の基準点となる位置用のenum。
・`LeftEye`
・`RightEye`
・`CenterEye`
・`Head`

:neutral_face:**VRNodeでどこまでパラメータに差はでるのか？**
　Oculus Rift DK2で試してみましたよ。
・GetLocalPosition()の場合
![getpos.gif](https://qiita-image-store.s3.amazonaws.com/0/94163/6304e633-efc5-be2f-1c6c-08018c41e08a.gif)

　`CenterEye`と`Head`はどの状態でも同じ値ですね。
　無回転の状態では全てのY座標とZ座標は同じです。
　無回転の状態で`LeftEye`、`RightEye`と`CenterEye`とは±0.03(3cm)の差です。


・GetLocalRotation()の場合
![getrot.gif](https://qiita-image-store.s3.amazonaws.com/0/94163/62405db1-27d9-548f-1672-165d95c2aedc.gif)

　
　どんな状態でも返す値は全て同じですね。
　※eulerAnglesを使ってオイラー値にして表示しています。


####VRSettings
・`bool enabled`
　VRの使用の有無を取得、設定できます。

:neutral_face:**enabledをfalseにすると、カメラの回転と位置は初期の状態になりますよ**
![enabled.gif](https://qiita-image-store.s3.amazonaws.com/0/94163/3bfebae4-66e9-36f9-1a18-08a6b4c7ec7d.gif)

　enabledをfalseに切り替えた際は、切り替え前のカメラの位置と回転になるわけではなく、初期に設定した状態に戻ります。

・`VRDeviceType loadedDevice`
　使用しているVRデバイスの種類を取得できます。
　Oculus Rift DK2を接続した場合には**"Oculus"**。
　何も接続していない場合には**"None"**が取得できました。

・`float renderScale`
　レンダリング解像度を取得、設定できます。
　デフォルトは`1.0f`です。
　`0.0f`に近づけるほどレンダリング解像度を下げることになるので描画負荷が軽減します。

:neutral_face:**解像度を下げるとどんな感じになるの？**
![render.gif](https://qiita-image-store.s3.amazonaws.com/0/94163/ca40a23e-cd34-cec2-a3dd-d241991a21a8.gif)
　0.2ぐらいになると見れたものではないですね。

・`bool showDeviceView`
　VRデバイスで表示されているものをメインディスプレイにミラーリングします(左目のみ)。