Skip to content

101 VRモニタリング (前編)

miuccie-miurror edited this page Jul 26, 2017 · 2 revisions

101 - VRモニタリング

まずはHTC-VIVEのHMD/コントローラーの状態やイベントをUnityで取得する方法を解説します。 カメラのステレオ出力等の基本的なVR対応は、Unityが標準で提供するVR-Support-APIを利用することでも可能ですが、 VIVEの場合はSteamVR-Pluginというライブラリセットを併用することでより詳細なコントロールが可能になります。

101 - VRモニタリング(前編)

SteamVR Plugin

https://github.com/ValveSoftware/openvr/tree/master/unity_package/Assets/SteamVR https://www.assetstore.unity3d.com/en/#!/content/32647

SteamVR Pluginは、Valve社が提供しているSteamVR対応アプリを開発するためのライブラリセットです。 Unity用のプラグインアセットも公開されており、Unity標準のVR-API(OpenVR)のみを使用するよりも楽に開発が進められます。 まずはこのPluginの使い方を見ていきたいと思います。


SteamVR Pluginのインストール   

AssetStoreでSteamVR Pluginを検索してUnityにインポートします。 この際ポップアップウィンドウでSteamVRが推奨する各種プロジェクト設定をオンにするかどうか聞かれますので全てにチェックを入れて適用してください。

インポートが完了したら、Projectパネル内のAssets/SteamVR/Assets/Prefabs/[CameraRig]をHierarchyパネルにドラッグして配置します。 またデフォルトのMainCameraは削除します。

この状態でプレイを実行すればVIVEのカメラにシーンが映るはずですが、正常に見れない場合は下記を確認してください。

  • Edit/Project Settings/Player/Other Settings の [Virtual Reality Supported]がONになっているか
  • Edit/Project Settings/Player/Other Settings の [Virtual Reality SDKs]にOpenVRが登録されているか
  • それでもダメな場合は、SteamVRアプリ経由でのVIVE本体の再起動を試してみてください


SteamVR Pluginの基本的な構造

シーンに配置した[CameraRig]プレハブのGameObject構造は下記のようになっています

  • [ CameraRig ]
    • Controller (left) / コントローラーを管理する
      • Model
    • Controller (right) / コントローラーを管理する
      • Model
    • Camera (head) / HMDを管理する
      • Camera (ears) / 音声機能を管理する
      • Camera (eye) / HMDカメラを管理する

HMDやコントローラーに対して独自の処理やオブジェクトを追加したい場合は、基本的には上記の各GameObjectにスクリプトや子オブジェクトをアタッチしていくことになります


HMD / VIVEコントローラーの参照方法

スクリプトから各デバイスクラスの参照を取得するには、上記の各GameObjectにアタッチされているSteamVR_TrackedObjectを経由し、SteamVR_Controller.Deviceクラスを取得します

void Start (){

  var headGO = GameObject.Find("[CameraRig]/Camera (head)");
  var headTO = headGO.transform.GetComponent<SteamVR_TrackedObject>();
  var head = SteamVR_Controller.Input((int) headTO.index);

  var handGO = GameObject.Find("[CameraRig]/Controller (right)");
  var handTO = handGO.transform.GetComponent<SteamVR_TrackedObject>();
  var hand = SteamVR_Controller.Input((int) handTO.index);

}

各デバイスの座標を取得するには下記のようにします

Vector3 posHead = head.transform.pos;
Vector3 posHand = hand.transform.pos;

VIVEコントローラー入力の取得方法

コントローラーの各UIの入力をリアルタイムに取得するには下記のようにします
入力状態とボタンマスクの組み合わせで様々な状態が取得可能です

void Update () {
  if ( hand.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger) ) {
    //トリガーが引かれると呼ばれます
  }
}

取得できる各ボタンは下記になります

  • SteamVR_Controller.ButtonMask.Trigger
  • SteamVR_Controller.ButtonMask.Touchpad
  • SteamVR_Controller.ButtonMask.Grip
  • SteamVR_Controller.ButtonMask.ApplicationMenu

取得できる入力状態は下記になります
トリガーにおけるTouchとPressの違いはPressの方が強く押し込んだ時となるようです

  • GetTouch
  • GetTouchDown
  • GetTouchUp
  • GetPress
  • GetPressDown
  • GetPressUp

またGetAxis()によってトリガーとタッチパッドの入力値を取得できます
トリガーの場合はx座標にのみ値が入っています

float x = hand.GetAxis (Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger).x;
Vector2 xy = hand.GetAxis (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad);

VIVEコントローラーイベントの取得方法

Update()内でリアルタイムに入力状態を監視する方法以外に、イベントハンドラを登録することで入力を検知する方法も用意されています

コントローラーのGameObjectにSteamVR_TrackedControllerコンポーネントをアタッチし、デリゲートメソッドを追加します

var handGO = GameObject.Find("[CameraRig]/Controller (right)");
var handTC = handGO.AddComponent<SteamVR_TrackedController> ();
handTC.TriggerClicked += new ClickedEventHandler (OnTriggerClicked);

public void OnTriggerClicked( object sender, ClickedEventArgs e ) {
     //トリガーが引かれると呼ばれます
}

登録できるイベントは下記になります

  • TriggerClicked / TriggerUnClicked
  • PadClicked / PadUnClicked / PadTouched / PadUnTouched
  • Gripped / UnGripped
  • MenuButtonClicked / MenuButtonUnClicked

VIVEコントローラーの振動方法

コントローラーを振動させるには下記のようにします
引数に振動の強さを渡せます。0~3000まで有効となるようです

hand.TriggerHapticPulse ( 3000 );