SteamVR Pluginのコントローラーバインドあれこれ




前回は[Indexコントローラーでの人差指から小指までの設定項目を表示させる方法](https://qiita.com/clses/items/64a855f8f2bb829f7d12) を書いた。
今回は**コントローラー設定（コントローラーバインド）について**。

Indexコントローラー向けに書くが、基本的なところはViveコントローラー、OculusTouchでも共通しているので、適宜読み替えていただきたい。

##コントローラーバインドとは
自分の理解としては、**「各VRソフトに対するボタン設定」**という感じ。
SteamVR Pluginでは、VRソフトを作る人が、コントローラーの入力と、それに対してソフトがどのようなアクションを起こすかを設定することが出来る。
普通のコンシューマーゲームであれば、コントローラーの配置や数は決まっているため、あまり気にすることがない。しかしPC VR環境では、ボタン数などが全く違うため、「決定ボタンはAボタン」のように決めることが出来ない。
そこで、「○○というコマンドが送られるボタンは決定ボタンにします」ということをソフト側で決め、「このボタンは○○というボタンを送信します」ということをコントローラー側に決めることで解決している。
ちょうど割符のようなイメージだろうか。
城を守る門番は、誰がこの門を通っていいのかを、ひとりひとりを観察して判断するのは効率が悪い。
人を見るのではなく、あらかじめ通行人に渡された割符を見ることで単純化している。
コントローラーバインディングは、誰にどの割符を渡したかのリストと考えればよいだろう。


##コントローラーのボタン割り当て変更方法

SteamVRの設定画面から、ボタンの設定変更をしたいアプリケーションを選び、下図のようなコントローラーバインド画面へ進む。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199149/3a71f69d-9103-a3bc-93e1-05f1e04ec068.png)

Steamのコントローラー設定では、各ボタンに複数の機能を追加できるようになっており、ボタン名の右にある＋ボタンで追加することができる。今の機能を消して他の機能で上書きしたい場合は、そのまま左下の鉛筆ボタンで編集に入る。今あるボタンに更に機能を追加したい場合は＋ボタンで追加した箇所の鉛筆ボタンを押して編集に入る。


![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199149/4ee572e4-a980-ab28-40bf-9911cc7722b4.png)

＋ボタンを押すか、既に表示されている機能の左上の四角（上図の場合「ボタン」と表示されている箇所）をクリックすると、機能の選択が表示される。
指の入力の場合は、「トリガー」と「ボタン」の２種類（＋αでいくつか出てくるが割愛）が出てくるので好きな方を選択する。
更に、右側の四角（上図で言う「なし」）をクリックすると、割り当てたいボタンの設定が出る。

追加された項目の左下にある鉛筆マークを押すと編集が可能になる。


####どうして複数の設定を入力できるか。
通常のゲームパッドの設定では、一つのボタンに複数の機能を登録することはできないが、VRのコントローラーでは、一つのボタンにスイッチの他複数のセンサーなどが付いているため、それらの個別に設定を割り当てる事が出来る。
例えば、人差指のところにある「トリガー」ボタンでは、
>タッチ	：接触センサー（ボタンに触っているかどうか）
>プル	：アナログ感圧（どのくらい押し込んだか）
>クリック：物理ボタン（最後まで押し込んでカチッとボタンを押す）

の３つの入力を区別できため、それぞれに違うボタンを割り当てることができる。

####ボタンの種類と検出条件
今のところ、ボタンと機能の種類としては以下の５項目を見つけた。もしかしたらもっとあるかもしれない。
これらの設定はコントローラーごと、ボタンごとに変わる。

><dl><dt>○ジョイスティック </dt>
<dd> ┗位置XYがそれぞれどの値か（２軸アナログ）</dd>
 <dd>┗タッチ　	ボタンに触れたか否か（オンオフ）</dd>
 <dd>┗クリック　	ボタンを押したか（オンオフ）</dd>

><dt>○トラックパッド </dt>
<dd> ┗位置　	XYがそれぞれどの値か（２軸アナログ）</dd>
<dd> ┗タッチ　	ボタンに触れたか否か（オンオフ）</dd>

><dt>○トリガー></dt>
<dd>┗プル　　　	ボタン押し込みの強さ（１軸アナログ値）</dd>
<dd>┗タッチ　	ボタンに触れたか否か（オンオフ）</dd>
<dd>┗クリック　	ボタンが一定値以上押されたか否か（オンオフ）</dd>

><dt>○つかむ </dt>
<dd>┗つかむ　　　ボタン押し込みの強さ（１軸アナログ）</dd>

><dt>○ボタン </dt>
<dd>┗タッチ　	ボタンに触れたか否か（オンオフ）</dd>
<dd>┗クリック　	ボタンが一定値以上押されたか否か（オンオフ）</dd>
</dl>

上記の検出条件ごとに、割り当てるボタン（機能）を選択する。
基本的には設定できるボタンしか表示されない。

なお、ボタンの設定は選択後すぐに反映・保存されているため、VR内で設定するとすぐに動作確認ができる。
手始めに、メニュー画面やジャンプボタンを割り当ててみると動作しているかわかりやすい。

##Legacy controller bindings
SteamVRでは、コントローラーごとにLegacy Controller Bindingsという設定がある。おそらく、後から新しいコントローラーが出てソフト側が想定していなかったとしても、動作ができるように各コントローラーの初期配置を決めているもののようだ。
ソフト側がきちんと対応している場合はそちらが優先され、対応したバインドファイルが無い場合はLegacy Controller Bindingsを使うようになっている（らしい）。
実際のファイルは
`C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\indexcontroller\resources\input`
にあるので、各自参照いただきたい。
(\indexcontroller の箇所まで戻ると、htcなどのフォルダが有るため、Vive等の他のLegacyBindingファイルを見たい場合はそこから移動) 


次は各コントローラーのLegacy Controller Bindingsの中身を、自分でわかりやすくするために表形式にしたものとなる。表の組み方が正しいのかは不明なので参考までに。

###- (index) legacy_bindings_index_controller.json
![legacy_bindings_vive_controller.json.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199149/8b0be198-1e71-35e9-34da-c489b98308f1.jpeg)

###- (Vive) legacy_bindings_vive_controller.json
![legacy_bindings_vive_controller.json.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199149/1e7fea55-7ea8-4239-73d6-8d72c90780e9.jpeg)

###- (Oculus) legacy_bindings_touch.json 
![legacy_bindings_touch_controller.json.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199149/90433a5d-a53a-45b2-8c41-dac2930c23a5.jpeg)




また、上記の内容をまとめ、各出力が各コントローラーのどの入力（ボタン等）になっているかも整理した。
###- SteamVR Plugin legacy binding 対応表
![legacy_bindings_index_controller.json.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199149/300e22e3-e097-640a-56e4-4f9ea1ca1721.jpeg)

あくまでデフォルトの値ということなので、具体的に何かに使えるというわけでもないが、各コントローラーの基本的な対応関係の参考になれば幸い・・・といった程度。

Aボタンとグリップが関係していたりと、設計思想が垣間見えてきて興味深い。
（最初にViveコンを出したけど、それだとボタン足りないからって後発の各社はABボタン作ってて、それに対応するためにこういう感じになったのかなーとかとか）
もしかしたら設定が隠されているだけで、他にも項目があるかもしれないけれど、今のところ私の方で分かったのはこのくらい。

分かり次第追加するかも。