Unity+UnrealEngine4+Blog.

UnityやUnrealEngine4とかについて学習したことを書いてます

UnrealEngineでVRコンテンツ向けにLeapMotionを使ってみた3

UnrealEngineでVRコンテンツ向けにLeapMotionを使ってみた3ではジェスチャーで、オブジェクトをコントロールする例を書いています。

f:id:nabesi777:20191017202050g:plain

 

 

Leapmotionにはデフォルトでのジェスチャー判定も4つ準備されてますが、今回は左右上下に手を振って、それに応じて目的のオブジェクトのポジションを変更したかったので、そんな感じのものを作ってみました。

 

デフォルトに用意されていない、独自のジェスチャーを定義したい時に参考になればと思います。

 

基本的に内容は前回からの続きで、この記事だけ見ても分からないかもしれません。

 

Leapmotionの前記事↓ 

nabesi777.hatenablog.com

 

nabesi777.hatenablog.com

 

 

 上の前回の記事で手の握り判定をとるために使用したHandMovedのノードをまた使います。

f:id:nabesi777:20191009102737p:plain

 

 前回同様にPlayerのブループリントに書いています。(後でLeapHandのほうへ書けばよかったかなーって思いました)これは手のひらがどちらの方向を向いているかの判定をとるためのものです。

f:id:nabesi777:20191009103113p:plain

 

繋ぎ終わった後は、PrintStringでちゃんと方向が取れているか確認します。PalmNormalの値を観察して上のようなノードになりました。

f:id:nabesi777:20191009103212p:plain

 

手の平の状態は今回はEnumで管理するようにしました。個人的にEnumは好みです。

下のようにEnumerationを作成します。

f:id:nabesi777:20191009103345p:plain

f:id:nabesi777:20191009103501p:plain

 

これを開いて、中身を下のように登録しました。手のひらがどういう状態にあるか、このEnumを見ればわかるように登録していきます。

f:id:nabesi777:20191009103543p:plain

 

再びPlayerのブループリントに戻ります。

変数を追加します。型は先ほど作成したEnumを指定します。

f:id:nabesi777:20191009103748p:plain

 

先ほど組んだノードのPrintStringの場所へ、Enumの左右上下を置き換え(Set)ます。

 手のひらの向きの取得はこれで終わりです。

f:id:nabesi777:20191009103916p:plain

 

 

続いて手を振っているという判定をとるためにブループリントを組んでいきます。

これはどう実装すればいいか悩みましたが、最終的にはわりといい精度でとれるようになりました。

 

ざっくり概要としては、手のVelocityが事前に設定した時間内に、指定した閾値を超えると手を振っていると見なすというものです。

 

これもPlayerのブループリントへ組んでいきます。

またまたHandMovedイベントを使用します。

f:id:nabesi777:20191009105130p:plain

 

まずは変数の準備から、Bool型を4つ作成しました。

DownThreshold

UpThreshold

RightThreshold

LeftThreshold

f:id:nabesi777:20191009104510p:plain

 

次に下のようにノードを組みます。

これは閾値の設定で手が左右上下の閾値を超える(または下回る)と、うえで作った変数がTrueになるという内容です。ただこれだけだとTrueになりっぱなしで意味がないので、一定時間を超えるとリセットの為にFalseにしますが、それは後程組んでいきます。

f:id:nabesi777:20191009105206p:plain

 

 

ここまでできたらエディターを再生して、ノードを見ながら手を動かしてなんとなく大丈夫かを確認します。左右上下の変数と実際の動きがあっているかの確認のためです。

 

 大丈夫そうなら、下のように変数をさらに2つ追加します。

Bool型です。

f:id:nabesi777:20191009105420p:plain

 

 

続いて手は動いているが、単に動いただけではなく本当に手を振っているかどうかを確認するためのノードを組んでいきます。

 

またまたこのイベントを使っていきます。同じくプレイヤーのブループリント内に書きました。下のようにノードを組んでいきます。

f:id:nabesi777:20191009105807p:plain

 

Delayに0.5と設定していますが、これは0.5秒以内に左右(または上下)の両方のフラグが立っている時には手を振っているとみなすという意味です。0.5は想定される手のスピードに応じて調整します。

f:id:nabesi777:20191009110009p:plain

 

 

 テストします。LeftRightMotionをPrintStringで書き出すノードをくんで、実際にエディターを再生して手を振ってみます。

f:id:nabesi777:20191009105744p:plain

 

手を振っているときだけTrueになれば成功です。

f:id:nabesi777:20191009105726p:plain

 

 

使い方も一応書いておきます。

今回はオブジェクトを操作するという使い方です。

 

動かしたいオブジェクトをブループリント化し、Player変数を作成してPlayerを参照できるようにします。

f:id:nabesi777:20191009111529p:plain

f:id:nabesi777:20191009111600p:plain

 

 Playerからはこんな感じでノードを伸ばします。

f:id:nabesi777:20191009111840p:plain

 

全体像 Motionのフラグが立っている時は対応する方向へ0.3づつPositionを動かす内容です。

f:id:nabesi777:20191009112210p:plain

 

 

重力の設定があるので、左右でためしてみて動いたら成功です!

f:id:nabesi777:20191009112330p:plain