Technology Blog
技術ブログ
2017.08.29
Stingray(VRテンプレート)の持ち上げ処理を調べてみる
(持ち上げ編)
今回も引き続き、『物を掴む処理』を見ていきます。
次回を含め、覚えることが盛りだくさんです。
画像の中の青い部分は前回にやった『物に触れている間の処理』です。
緑の部分はまだ特に触れてはいませんが、
基本的にいつも通りの入力(トリガー)を拾う処理の為、割愛します。
■ 状態のチェック
コントローラのトリガーを引いた際にオレンジの部分の処理が行われます。
ここでは、触れている物の状態をチェックし、『持ち上げることができるか』を判定しています。
◯ Is the Wand Touching an Object?
最初に、変数『wand_is_touching』の値で『Branch』ノードを実行しています。
この変数は前回の『Physics Trigger』の処理で何かに触れている時にTrueに変更されています。
つまり、『何かに触れているか』をチェックしています。
◯ check for no pick up in unit data
Trueならば今度は変数『touching_unit』の値が持つ『pick_up』のデータと『no』を
『Compare Objects』ノードで比較しています。
『Compare Objects』ノードは、A・Bに渡された値が同じであるかどうかを返します。
まとめると、ここでは
『触れているユニットが持つ持ち上げられる物体かどうかのデータを見て、その内容がnoであるかどうか』
をチェックしています。
◯ Is the Actor Dynamic?
上記処理で等しくなかった(noではなかった)場合、
『Is Actor Dynamic』ノードの結果がTrueであるかという処理を行っています。
『Is Actor Dynamic』ノードは、『Actor』に指定された物体が動的であるかどうかを返します。
つまり、『持ち上げようとしている物体が動かせるものか』という確認になります。
ここまでの処理で、『物体を持ち上げるまでの確認』が完了しました。
■ Attach the Object to the Wand
続いて、物体を持ち上げる処理を見ていきます。
画像の中の黄色のエリアですが、
かなり量が多いので幾つかのグループに分割して処理を見ていきます。
①対象を動かせるようにする
まず、『SteamVR Set Actor Kinematic』を使用して、対象を自由に動かせるようにします。
②スナップをきかせるかどうかをチェック
続いて、現在触れているユニットがスナップをきかせるような物(バット)であるかをチェックするために、
触れているユニットが持つ『snap』というスクリプトデータが『yes』かどうかをチェックしています。
『snap』が『yes』である場合、
『preserve_world』をFalseに変更し、
ユニットのローカル位置とローカル回転を0に変更しています。
こうすることで、どんな状態の物を拾っても必ず同じ位置、同じ向きに向くようになります。
『snap』が『yes』以外であった場合、
『preserve_world』をTrueに変更します。
どちらの場合でも終了後は次の処理に遷移します。
③リンク付けを行う
次は『SteamVR Unlink Node From Tracker』を使用して、
現在手に触れている物のリンクを外しています。
その後、コントローラに対してユニットのリンク付けを行います。
④各種イベントの実行と変数の設定
最後に、リンク付け後に必要な処理を行っています。
コントローラがリンク中であるかを示す変数『is_linked』をTrueにしてから
『Sequence』ノードに続いています。
『Sequence』ノードは上から順に繋げられた処理を実行するというものです。
実装に必須な処理というわけではありませんが、
『Flow』の可読性向上に役立つことが多いです。
持ち上げたユニットの『pickup_sound』イベントの実行、
持ち上げられたユニットにコントローラの情報をセット、
持ち上げたユニットの『Linked』イベントの実行、
持ち上げたユニットの『hilight_off』イベントの実行。
という順に行っています。
こうすることで、『対象を持ち上げる処理』は実装されています。
しかし、これだけではまだ『対象を手放す』事はできません。
次回は、『対象を手放す処理』を見ていきます。