-
Notifications
You must be signed in to change notification settings - Fork 18
101 VRモニタリング (前編)
まずはHTC-VIVEのHMD/コントローラーの状態やイベントをUnityで取得する方法を解説します。 カメラのステレオ出力等の基本的なVR対応は、Unityが標準で提供するVR-Support-APIを利用することでも可能ですが、 VIVEの場合は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の使い方を見ていきたいと思います。
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本体の再起動を試してみてください
シーンに配置した[CameraRig]プレハブのGameObject構造は下記のようになっています
- [ CameraRig ]
- Controller (left) / コントローラーを管理する
- Model
- Controller (right) / コントローラーを管理する
- Model
- Camera (head) / HMDを管理する
- Camera (ears) / 音声機能を管理する
- Camera (eye) / HMDカメラを管理する
- Controller (left) / コントローラーを管理する
HMDやコントローラーに対して独自の処理やオブジェクトを追加したい場合は、基本的には上記の各GameObjectにスクリプトや子オブジェクトをアタッチしていくことになります
スクリプトから各デバイスクラスの参照を取得するには、上記の各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;
コントローラーの各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);
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
コントローラーを振動させるには下記のようにします
引数に振動の強さを渡せます。0~3000まで有効となるようです
hand.TriggerHapticPulse ( 3000 );