前回leapMotionのセッティングと開発の下調べをしました。
私の環境はMac、SDKは2_3_0、Unity5.6.2です。
実際自分で何か作ろうってなると、できることは大まかに2種類?かな
・手を動かして何かに触ったり、自分の手の動きを何かに反映させたりする系
・ジェスチャーで何かを操作する系
ジェスチャーについて
せっかくなのでジェスチャーで何か作りたいのですが、2_3_0ではデフォルトで認識できるのは4種類の動きだけらしい。
[Unity][LeapMotion] 付属のジェスチャーを試してみる | ftvlog
キータップ(地面と垂直)
スクリーンタップ(地面と平行)
円を書く
スワイプ
とりあえずこちらを参考にスワイプの検知をしてみました。
new sceneにHand Controllerオブジェクト置いて、上の記事に載っていたスクリプトをつけました。
ジェスチャータイプの判定はusing Leap;を入れた上でこんな感じで書くらしいです。
if (gesture.Type == Gesture.GestureType.TYPESWIPE) {
ちなみにタイプは7種類表示されました。ただ2つ被っているし、invalidは無効っていう意味らしいのでやはり4つですね。
精度はイマイチですが一応反応はしてくれました。
バージョンが上がれば手を握るとかピンチとか別のジェスチャーも認識できるっぽい。
Pinch Move – Leap Motion Gallery
追加アセットを使えばもっと複雑なジェスチャーが認識できる??
Leap Motion社、サムズアップを認識するUnityアセットをリリース | VR Inside
そしてこちらの指でお絵かきもやりたかったけどTrail Rendererというスクリプトが2_3_0にはなかったのでとりあえず保留。
ただwindows環境でサンプルは遊べました。
手の種類を変える
hand contraollerオブジェクトの手の種類を変えるのはHand ControllerスクリプトのLeft Rightのとこを適当なプレハブに変えれば良い。
SaltLight~が自分の手に近かった。長さはcut,round,fullの3種類がある。
Rigidbody
前回の記事でもキューブを触るやつを作りましたが、リジッドボディをつけてもキューブがすごく暴れてしまいます。
こちらを参考にMass(重さ)とか空気抵抗とかをいじってみましたが、あまり変化はありませんでした。
じゃあサンプルはどうやっているのかなって見ると、例えばPinchingSandboxというシーンではHandControllerの中のHand Physics ModelにPinchingHandという手の形をしたリジッドボディみたいなやつに、Grabbing Handというスクリプトをつけたものを適用していました。
またcubeの方にはRigidbodyの他にGrabbable Objectいうスクリプトをつけていました。
なので自分のシーンでも再現するために、サンプルシーン内にあったPinchingHandをプレハブ化してHand Physics Modelに適用。CubeにもGrabbable Objectをつけました。
そしたら握る動作をしたら握ることができました。全体的な挙動も少しは落ち着いたかな?
最終結果
いろいろ調べましたが初心に戻った結果、スワイプで結界を表示するものを作りました。
オブジェクトの表示非表示はenableを使いました。最初はsetactiveでやっていたのですが、消えてくれなかった。
消す時にパーティクルを発生させています。
using System.Collections.Generic;
using UnityEngine;
using Leap;
public class gesture : MonoBehaviour {
Controller controller;
HandModel hand_model;
public GameObject kekkai;
public ParticleSystem particle2;
void Start () {
controller = new Controller ();
// スワイプのジェスチャーを有効にする
controller.EnableGesture (Gesture.GestureType.TYPESWIPE);
}
void Update () {
Frame frame = controller.Frame ();
GestureList leap_gestures = frame.Gestures ();
for (int i = 0; i < leap_gestures.Count; i++) {
Gesture gesture = leap_gestures [i];
// if (gesture.Type == Gesture.GestureType.TYPECIRCLE) {
// Debug.Log ("maru");
// }
//ジェスチャーがスワイプだった場合
if (gesture.Type == Gesture.GestureType.TYPESWIPE) {
SwipeGesture Swipe = new SwipeGesture (gesture);
// スワイプ方向
Vector SwipeDirection = Swipe.Direction;
// 0より小さかった場合(下げてる)
if (SwipeDirection.y < 0) {
// Downのログを表示
Debug.Log ("Down");
//kekkai.SetActive (false);
GameObject kekkaiobj=kekkai.gameObject;
kekkaiobj.GetComponent<Renderer>().enabled = false;
particle2.Play ();
// 0より大きかった場合(上にあげてる)
} else if (SwipeDirection.y > 0) {
// Upのログを表示
Debug.Log ("Up");
GameObject kekkaiobj=kekkai.gameObject;
kekkaiobj.GetComponent<Renderer>().enabled = true;
particle2.Stop ();
}
}
}
}
}
enableあたりはこちらからお借りしました。
パーティクルはPlay On Awakeを外した状態で、スクリプトからparticle2.Play ();、particle.Stop()で制御できました。
結界オブジェクトも、パーティクルもpublicで持ってきています。
妖はこちらからお借りしました。
手を結界師のコスチュームのやつにしたらそれっぽいかな?

【国内正規代理店品】 Leap Motion 小型モーションコントローラー 3Dモーション キャプチャー システム
- 出版社/メーカー: Leap Motion
- メディア: エレクトロニクス
- この商品を含むブログ (3件) を見る