StingrayVRテンプレートのVR向けノードをまとめてみた


Stingrayのビジュアルスクリプティング機能、『Flow』では、
最初のテンプレートの選択によってVRに特化したノードを使用することができるため、
簡易的な物であれば建築分野用のVRデモなどを実装することもできます。

今回は、VR特化のノードについて、用途ごとに以下にまとめてみることにします。

ちなみにSteamVR(HTC Vive)用のノードを例にして挙げていますが、
StingrayにはOculus/GoogleVR/GearVR用のノードもあります。
ただし、どのHMDでも内容はほぼSteamVRと同一の為、割愛します。

最初に注意点ですが、
VR用ノードはStingrayのVRテンプレート実行時に同時に作成されるという仕様のため、
プロジェクト作成時に『VR HTC Vive』テンプレートを選択しないと、下記のノードが使用できません。
(使用するHMDによってテンプレートを選択してください)



※Viveコントローラの入力を取得したい

・SteamVR Button

画像1

このノードはUpdateピンに接続されたタイミングで
『Controller Index』に設定されたコントローラの
『Button Name』に設定されているボタンが押されたかどうかを取得し、
処理を分岐させています。
ボタンの割り当てはViveの公式ドキュメントを参考にしてください。
(尚、システムボタンだけどういうわけか反応がありませんでした)

『Pressed』は最初にボタンが押された時
『Held』ボタンを押し続けている時
『Released』ボタンから指を離した時にそれぞれ呼ばれます。
『Value』入力の状態を0~1の範囲で返します。
(指を離している時が0、完全に押し込んだ時が1。)

以下はトリガーの入力の範囲をログに出力するサンプルです。
画像のようにノードを接続しています。



画像2

・SteamVR Touch
こちらのノードは上述したButtonの『Touch Up』~『Touch Right』までをより詳細にしたノードです。

Buttonの方と同じ、『Pressed』『Held』『Released』の他、
タッチパッドに触れている間呼ばれ続ける『Touched』
タッチパッドから指を離したときに呼ばれる『Untouched』が追加されています。
X/Yは指先が触れている座標を中央を0として1~-1の範囲で返します。

ちなみに、どちらも『SteamVR』->『Input』の中にあります。



※Viveコントローラに振動を与えたい

・SteamVR Controller Feedback

画像3

このノードは『Controller Index』に設定されたコントローラに対し、
『Seconds』秒間の振動を与えます
ただし、0.003999以上の値を設定すると、
強制的に0.003999に合わせられてしまいます。


VRのデモなどで『何かに触れた』という事を表す場合は単体で使用すればよいのですが、
ゲームなどの演出のように、長期的に振動させたい場合は、
画像のように連続で呼ばれるような処理を作る必要があります。



※HMDの画面をフェードさせたい


・SteamVR Fade In
・SteamVR Fade Out


画像4

シーン移動や演出の為に画面にフェードを入れたい場合はこれらのノードを使用します。
『Color』には何色にフェードするか、
『Seconds』には何秒でフェードが完了するかを設定します。
基本的には『Fade In』と『Fade Out』をセットで使用すると思います。

なお、フェードするのはHMDの画面だけですので、
HMDではない通常の画面をフェードさせたい場合は、別途処理を追加する必要があります。



※HMDとの接続やトラッキング状態をチェックしたい


・SteamVR Is Enabled
・SteamVR Is Tracked


画像5

『Is Enabled』はViveが有効に接続されているかどうかをチェックします。
あくまで、『有効であるか』だけをチェックするため、『トラッキングされているか』は考慮されません

『トラッキングされているか』をチェックしたい場合、『Is Tracked』の方を利用します。
引数に設定した対象がトラッキングされているかどうかをチェックします。



※コントローラやHMDの位置を取得したい


・SteamVR HMD Pose
・SteamVR Controller Pose


画像6

『HMD Pose』はHMDの頭や左右の目の位置の座標や回転
『Controller Pose』は各種コントローラの位置や回転を取得できます。
どちらもワールド・ローカルを選択できます。

画像0



また、このブログで触れたノードは全てLuaによる実装が行われています。
更に踏み込んだ実装の調査をしたい場合は、直接Luaのソースコードをチェックしてみてください。