Technology Blog
技術ブログ
2017.08.24
Stingray(VRテンプレート)のコントローラ処理を調べてみる
(トラックパッドとユニットフロー)

前回は『Flow』による簡易的なプログラムを組んでみました。
今回からは本格的な要素に入ります。
StingrayのVRテンプレートでは
非常に軽い建築デモ程度であればそのまま使えてしまえるような機能が最初から実装されています。
それらの機能がどのように実装されているのか、少しずつ処理の解説を交えつつ、見ていきましょう。
今回、見ていく処理は『コントローラの処理』になります。
さて、前回ではFlowの一種である『レベルフロー』を見ていきましたが、
いくらレベルフローを見てみたとしても、コントローラの処理と思しきものはどこにもありません。
なぜなら、コントローラの処理はコントローラ自身にあるためです。
まずは、どこでコントローラ自身の処理が見られるのか、についてです。
エディタの画面の下側にあるタブを見てみましょう。
これは『アセットブラウザ』と呼ばれ、
現在開いているプロジェクトの中にあるモデルや音などのアセットを見ることができます。
この中に、コントローラのモデルがあります。
アセットブラウザの左側にあるリストから
『VR_steam』->『models』->『controller』を選択します。
すると、コントローラのモデルが見つかるはずです。
このモデルをダブルクリックしましょう。
※ユニットエディタとユニット
モデルをダブルクリックすると、画像のような画面が開かれます。
この画面は『ユニットエディタ』といい、『ユニット』を編集する画面です。
『ユニット』とは、レベルに配置されるものの名前であり、
一つ一つがメッシュや各種プロパティを持っています。
また、ユニット自身がFlowを持つこともでき、
ユニットが所持するFlowは『ユニットフロー』と呼ばれます。
そして、ユニットエディタではユニットのプロパティの変更や、
ユニットフローの編集などを行うことができます。
画面の下側にある『Unit Flow』タブをクリックして開いてください。
こうして開かれるのがユニットフローの画面です。
細かな点や用途に違いはありますが、基本的な部分はレベルフローと変わりません。
今回は、ここに実装されている処理の内容を調べていきましょう。
コントローラのユニットフローを見てみると、
複数のノードが一つのブロックに囲まれているのがわかるかと思います。
これは『グループ化』といい、いくつかのノードを一つのグループにまとめ、
一括で削除したり、移動したりできるようにする機能です。
また、グループには名前を付けることができ、
Flowの可読性を向上させるという事もできます。
コントローラのユニットフローでは6つのグループがあります。
この記事では、このうちの1つのグループの処理について調べていきます。


※『Tracking dot on the track pad.』
このグループでは『トラックパッド上のボールの移動』が実装されています。
プレイ中、コントローラを見てみるとトラックパッドを操作している間、
指を触れている個所にボールが出現しているはずです。
試しに、このグループを削除してからプレイしてみると、ボールが出現しなくなります。
ちなみに、グループをまるごと削除するためには、グループのタイトルの部分をクリックしてからDeleteキーを入力します。
①トラックパッドの入力を取得
『Get Unit String Data』ノードは
ユニットに設定されているKeyと同名のスクリプトデータを取得します。
『スクリプトデータ』とはユニットがそれぞれ持つ数値などで、
プログラムでいうところの『変数』のような役割を持ちます。
ユニットエディタの右側にある『Script Data』から、追加や削除ができます。
コントローラのスクリプトデータを確認してみると、
『Get Unit String Data』で指定されている
『controller_index』というキーが見つかるはずです。
このキーはコントローラの番号を示しています。
controller_indexの値は『Level Update』に接続された
『SteamVR Touch』ノードの引数に用いられています。
これで『番号で指定されたコントローラのトラックパッドの入力を取得する』という処理になります。
②ボールの出現位置の計算
『SteamVR Touch』のX/Yの値は、トラックパッドで入力されている座標を1~-1の範囲で表しています。
この値を『Multiplication』ノードで乗算しています。
これは、そのままX/Yの座標を使用してしまうと、値が大きすぎてトラックパッドからボールが離れてしまうためです。
乗算の結果は『Vector From Components』で使用され、ベクトルになります。
このベクトルは最終的にボールの出現位置のローカル座標となりますが、
ここではYの値をYではなくZに代入する必要があるため要注意です。
最終的なYの値になるのは、先ほどの計算結果に更に乗算を重ねたものとなります。
この結果がトラックパッド上のボールの高さとなります。
③ボールのメッシュの可視・不可視を変更
『トラックパッドに指が触れた』事を表す『Touched』と接続しているのは
『Set Unit Visibility』ノードです。
このノードは引数のユニット内の指定したグループに該当するメッシュの可視性を変更するという処理を行います。
この場合の『グループ』は『ビジビリティグループ』の事であり、ユニットフローのノードの『グループ』とは異なります。
『ビジビリティグループ』とは、
ユニットが持つメッシュをひとまとめにした物であり、
メッシュの可視・不可視を一括で変更したりする場合に役立ちます。
ビジビリティグループはユニットエディタ右下の『Visibility Groups』から
変更や新規追加、確認が可能です。
また、ユニットが持つメッシュは画面左側の『Outliner』から確認できます。
コントローラのビジビリティグループを確認してみると、
『trackpad_touch』というグループだけが見つかるはずです。
グループ名をクリックすると、そのグループに含まれるメッシュが確認できます。
『trackpad_touch』のグループには
『trackpad_touch』というメッシュだけが含まれています。
画面左側のアウトライナから『trackpad_touch』というメッシュをクリックし、
画面下側の『Viewport』タブを選択すると、
『trackpad_touch』がトラックパッド上のボールを示していることがわかります。
再度ユニットフローを見てみると、同じノードが『トラックパッドから指が離れた』事を表す『Untouched』と接続されています。
先ほどの『Set Unit Visibility』と異なるのは、引数のVisibleがこちらではFalseになっているという点です。
この時点で、『指が触れるとボールが出現し、離れるとボールが消える』という処理になっていることがわかるはずです。
④ボールを移動
最後にボールを出現させる処理から繋がっている『Set Unit Local Position』です。
このノードは引数に設定されたユニットのオブジェクトのローカル座標をPositionの値に変更します。
今回は、trackpad_touchメッシュを②の結果に変更しています。
この部分で『ボールを指に触れた場所へ移動させる』という処理が実装されています。
つまり、このグループ全体では
『トラックパッドに指が触れている間、ボールを可視にし、指が触れている箇所にボールを移動させる。
トラックパッドから指が離れたら、ボールを不可視にする』
という実装が組まれていることになります。
若干中途半端ですが、今回はここまでです。
次回は、このコントローラのユニットフローの中で、
2つか3つのグループの処理を説明していきます。