Technology Blog

技術ブログ

2017.08.29

Stingray(VRテンプレート)の持ち上げ処理を調べてみる
(離す処理)



前回、ついに『持ち上げる処理』の実装を全て見終えました。
しかし、これまで見た処理はあくまで『持ち上げる』というだけの処理です。

今回は、『持ち上げたものを離す』処理を最後まで見ていきます。



■ Un-link – Release



赤の部分は『トリガーが離された時』に実行されています。
画像だとやや見づらいので、
この画像を更に黄色・オレンジに区切って詳細に見ていきます。

①離したコントローラがリンクされているかチェック



まずは、持ち上げている状態かどうかを表す変数『is_linked』
true(持ち上げている状態)なのかをチェック、
『ユニットを持ち上げているコントローラ』『トリガーを離したコントローラ』が同一かもチェックします。

②コントローラとのリンクを外し、加速度を設定する



続いて、『SteamVR Unlink Node From Tracker』ノードで
ユニットとリンクしている対象(コントローラの持つ持ち上げ関数)とのリンクを外します。
その後は『SteamVR Set Actor Kinematic』で自由に動かせないようにします。

直後の『Set Actor Velocity』ノードには
前々回に登場した変数『wand_velocity』の値をセットしています。

『Set Actor Velocity』ノードは引数のユニットのアクタに対して引数の分だけの速度を設定します。

変数『wand_velocity』はコントローラの持つ加速度を表しているため、
離した時点での加速度がそのままユニットの速度になっているということになります。

加速度の設定が終わったら変数『is_linked』をfalseに変更、
ユニット自身の『Unlinked』イベントを実行しています。

『持ち上げたものを離す』という処理はこのように実装されていました。

一応、この先にもいくつか処理が残ってはいますが、『離す』処理はここで完了です。



■ Hide – Unhide the Controller



ここでの処理は『物を離した後、コントローラを可視状態にする』というものです。

これはVRテンプレートのバットのユニットフローを見ないとわからないのですが、
一部のユニットは『linked』イベントの処理で
『コントローラを不可視にする』
という実装がされています。
ここで可視状態にするという処理を行っていない場合、
バットを離した後でもコントローラが見えないままという問題が発生するため、
この実装が行われています。

ちなみに、ここで使用されている『Set Unit Visibility』は以前使用した時とは異なり、
ユニットそのものを引数で設定しているため、ユニット全体の可視・不可視を変更できています。



■ set_invisable



その下にある『Event for Hiding the Wand』から続く処理は
『External In Event』ノードから始まる、独立したイベントです。

先ほどの説明で出てきた『コントローラを不可視にする』という処理はここで行われています。
つまり、
コントローラによってバットが持ち上げられる
→バットの持つlinkedイベントが実行される
→バットのlinkedイベントの中でコントローラのset_invisableイベントが実行される
という処理の流れになっています。

一旦両方のコントローラを可視状態にしてから、
不可視に設定するコントローラだけ不可視にしています。
使用しているノードは可視の時から変わりません。



以上で、コントローラの持ち上げ処理は全て見終えることができました。
残っているコントローラ関連の処理はテレポートのみとなります。
残念ながら、StingrayのVRテンプレート調査はこれで終わりですが、
ここまで基礎を理解することができれば、
きっとテレポートの処理を理解することも簡単だと思います。

今まで、ありがとうございました。


関連ブログ