【Unity SteamVR Plugin】3つ以上のコントローラ・トラッカーを使用する時に、それぞれを入れ替える

アセット

HTC Viveで3つ以上のコントローラやトラッカーを使用したい時に使える、
コントローラを付け替えずにVR上の設定を入れ替える方法を紹介します。

こんにちは。
自称 積木製作VR開発部の『動』表現担当 中谷です。

HTC Viveでは、コントローラを3つ以上使用することで
両手のみならず足などもトラッキングすることができます。

3つ目以上は有線接続が必要なので、なかなかに面倒ではありましたが…。

Vive Hands and Feet Tracking

こんな感じに。

最近ではVive Tracker も販売されたので、
手足どちらも無線になったことで、
随分と身軽になりました。いやホント楽になりました。

 

で、このように手足にコントローラやトラッカーを装着してしまうと、
それぞれを物理的に交換することが難しいです。

4つともコントローラを使用している場合、
いざ作ったコンテンツを実行すると
手と足とが、また、それらの左右がごちゃごちゃに入れ替わって認識されていることが頻繁に起こります。

足をトラッカーにすることで、手足が入れ替わることは防げるのですが、
それでも左右の足が入れ替わってしまっていたり…。

そこで、今回はコントローラを物理的には入れ替えずに
VR上のコントローラを入れ替えてしまうやり方を紹介します。

 

 

 事前準備

まずは、4本のコントローラが認識されるようにしましょう。

SteamVRの[CameraRig]の中にあるコントローラを複製し、区別が付くように名前を変更しましょう。

完了したら、[CameraRig]にアタッチされているSteamVR_ControllerManagerの、
Objectsの配列に追加しましょう。

 

 

 Indexを入れ替えれば、コントローラが入れ替わる

[CameraRig]にあるコントローラのGameObjectは、
SteamVR_TrackedObjectというコンポーネントで動いています。

このコンポーネントのIndexの値を変更すると、
GameObjectが他のコントローラと重なってしまったり、
あるいはベースステーションの位置に瞬間移動してしまいます。

コントローラがベースステーションの位置に飛んでしまうのは不本意なのですが、
ここを弄ることによって物理的なオブジェクトとVR上のコントローラの
対応(ペア?トラッキング対象?)を変えられることがわかりました。

ということであれば、VR上のコントローラのIndexを、
本来使いたいはずのコントローラのIndexに入れ替えてしまえばいいのです。

 

 

 実装


○まずは、各コントローラのIndexを取得しておく

○対応したキーを押しながらコントローラのトリガーを引くことで、Indexを入れ替える

○入れ替えたら、SteamVR_TrackedObjectのIndexに代入する

という流れで実装しています。

正直なところ最適化されている状態ではありませんが、
コントローラ・トラッカーがStamVRに認識されている状態でコンテンツを起動すれば
ちゃんと機能はします。
(認識されるまえに起動してしまうと失敗するため、改良が必要ではあります。)

 

下記の各スクリプトは、以下のように使用します。

IDReminder.cs : staticクラスのため、Projectにあれば良い。

ControllerReseter.cs: シングルトンなMonobehavior。Manager的な最上位階層のGameObjetにアタッチしておく。

LongPressToSet.cs : 各コントローラにアタッチしておく。

FootSwap.cs:足用コントローラの一方にだけアタッチしておく。

 

 

コードは以下の通りです。

 

 

 

 

 使用方法

まずは、各コンポーネントのInspectorの、StamVR_TrackedContorllerを参照するものには、
ドラッグ&ドロップで参照を追加しておいてください。

すべてのコントローラ(トラッカー)の電源を入れ、
ペアリングが完了している状態でコンテンツを起動(またはUnityEditorでPlay)してください。

各コントローラが見えている状態で、

左手に設定:Aキーを押しながらコントローラのトリガーを1秒間長押しする

右手に設定:Sキーを押しながらトリガーを1秒間長押しする

左足を設定:Dキーを押しながらトリガーを1秒間長押しする

右足を設定:Fキーを押しながらトリガーを1秒間長押しする

左右の足を入れ替える:Gキーを押す

上記の操作で入れ替えが可能です。

swapping vive controllers

 

※アテンド上の都合によりASDFGキーを使用していますが、
普通は使いにくいでしょうから
LongPressToSet.cs 及び FootSwap.csを書き換えて
任意のキーやボタンの組み合わせで設定してください。

 

 最後に

現状では、手足全てがトラッカーの場合、そのままではボタンが使用できない問題や、
トラッカーとコントローラを入れ替えた場合VR上の表示を更新してなかったり、
途中でコントローラを追加した時の対策がなされていない状態ですので、
時間のある時にもっと使いやすいものにしたいと思います。

それでは。

 


 

 

 04/23 追記

ソースコードを見直し、修正・最適化を行いました。

[!]UniRxを使用したシステムに変更。UniRxをAssetStoreからダウンロード・インポートして下さい。
○コンテンツ起動後にコントローラを接続・認識された場合でも利用可能に
○SteamVR側でIDが勝手に入れ替わった場合も対応可能に

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)