UE4 Leapmotionで道具の情報取得
わりと苦戦してしまった…
というかLeapmotionの設定で道具の追跡にチェックが入ってなくて3-4時間格闘してしまった……
ということでいろいろメモっておこうかと思います。
今回もこちらのLeapmotionプラグインを使わせて貰ってます。感謝……!
[Plugin] Leap Motion - Event Driven
棒きれの認識ですが、Leapmotionの道具関連は「Tool」という名前で用意されているようです。
Tool — Leap Motion Java SDK v2.2 documentation
「棒状のようなもの」から「わりと棒状のようなもの」まで認識してくれる様子。スゴイ。
診断ビジュアライザーでテスト
UE4のプラグインで取得できるのは、
・位置
・長さ
・大きさ
なようなので、それぞれの値をまず取得してみますー。
Toolの値の取得手順は、
- LeapControllerコンポーネント経由でPointableを取得
- Pointableの GetIsToolノードで取得したPointableが「Toolの値」かどうかを判別
- 判別結果が True であればPointableの値をToolとみなして使用する
な感じになりました。
Githubにあるプラグインのをソースを解読してみたところ、
Toolの取得には現状この方法しかない様子でありました。
Pointableについて
最初に取得する「Pointable」というのは、Finger、Tool情報の派生元クラスで、
位置情報、長さ、大きさ、向きなど、汎用的な情報が取得できるクラスのようです。
では実際その値取得を行っていきます!
Pointable取得
LeapControllerコンポーネント経由で取得します。
こちらのLeapControllerの設定については導入の際に追加したものです。
詳細はこちらを参考にしてみてください!
UE4でLeapmotionつかってみるついでに指からびーむだす(Leapmotion導入編) - toorsoo's diary
①GetFrame ノード
このフレームデータは現在の更新時間、「FPS」でいわれるフレームと同じ意味のようです。
ノードには過去のフレームデータを取得できる引数が用意されていますが、
今回は現在のフレームデータを使いたいので「0」を入れておきます!
②Pointables ノード
フレーム内で取得できたPointableのリストを取得します。
③ループでPointablesにある全てのPointableにアクセス
PointablesのGetCountノードで取得した数分、ループさせます。
④GetPointableById ノード
これでPointableにアクセスする事ができました。
次に取得したPointableからToolで使用する情報を取得してみます。
Tool情報取得
①GetIsTool ノード
Toolかどうかを判別! Toolなら処理させます。
書いてて気づいたんですが、イベントディスパッチャーでPointable情報を専用イベントに投げれば、
もう少しノードがまとまりそうです…!
②StabilizedTipPositionノード
棒の先端の位置情報です!
③棒の逆側の端の座標です。
向きと長さを②で取得した座標に足して算出しています。
向き:Direction ノード
長さ:Length ノード
④Widthノード
棒の太さです。
上のノードではそれぞれ取得した位置にデバッグ用の表示をしています。
こんな感じに表示されます!