UnityでのLeapmotionの使い方

 

Leapmotionの使い方

とりあえずのまとめをしておきますのでここから情報を引き出していってください。

スクリプト上でLeapmotionから情報を得るにはまずはLeap namespaceにあるクラスを使うのでまずはusingをしておきます。

そしてフィールドとしてControllクラスをフィールドとして宣言しておきます

 

Using Leap;

 

Controller controller;

最初にControllクラスが必要ですので、Contolloerオブジェクトをインスタンス化しておきます。

ControllerクラスはLeapmotionと直接つながっているようなイメージなので、これからそれぞれの情報を引き出す事ができます。

Unityで使う場合にはStartかクラスのフィールドとして書いておくと良い

start(){

    controller = new Controller();

}

 

Leapmotionかざしている手の情報を得るにはControllerクラスのFrameメソッドを使用します。

 

Frame frame = controller.Frame();//現在の情報入手

 

 

これで現在のLeapmotionで捕らえられている手の情報を入手する事ができます。

 

Leapmotionには60フレーム前までデータが残っており、Frameメソッドの引数として数値を入れてやると、その数値の分だけ前の情報を入手する事ができます。たとえば引数として10を入れると10フレーム前の情報が手に入ります。

 

 Frame frame = controller.Frame(10);//10フレーム前の情報入手

 

 

Frameの中にはさまざまなプロパティが保持されているので情報を得ます。

今回必要なのはHandという手の情報なのでそれを取得する。

HandプロパティはGeneric型のListとして保持されているので受け取るときはその変数を宣言する。

 

 

              List<Hand> hands = frame.Hands;

              //var使用でも

 

 

これからHandの情報を得ることが出来る。

Handには、さまざまな情報があるので色々な情報を得ることが出来ます。

手のひらや腕、手の全体の情報などはここからとることができます。

 

一部はここで紹介しますが、詳しくは公式リファレンスを読んでください。

https://developer.leapmotion.com/documentation/csharp/api/Leap_Classes.html

 

手のひら

手のひらの情報はHandの中のPalm~というプロパティとして保持されています。

              例)PalmPosition //手のひらの位置

              PalmVelocity //手のひらの移動速度

              方向はDirectionに保持。

手には右手左手がありますが、それを判別するプロパティも存在します。

              isLeft

              isRight

 

色々な強さ

              Handにはつかみの強さやつまんだ強さなどが0~1の値で保持されています。

              GrabStrength//つかみの強さ

              PinchStrenght//つまみの強さ

 

手にはそれぞれ画面に移った順に個別にIDが割り振られるのでそれの取得

Id

このidをFrameオブジェクトのHandメソッドに渡す事で特定の手の追跡をする事もできます。

 

次にFingerの情報を得ます。FingerはHandと同様に、Listとして保持されているので取得するのは同じように取得します。

 

 

List<Finger> fingers = hand.fingers;

 

 

Fingerにはそれぞれの方向を表すDirectionや指が伸びているかを表すisExtended、

長さを保持しているLengthなどがある。

 

さて、ここまでで書いた事をまとめてコードにしてみようと思う。

情報だけを出力できるようにする。

 

 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using Leap;

public class ha : MonoBehaviour {

    Controller controller;
    public Text text;
 // Use this for initialization
 void Start () {
        controller = new Controller();
 }
 
 // Update is called once per frame
 void Update () {
        Frame frame = controller.Frame();
        string info;
        List<Hand> hands = frame.Hands;
        foreach(Hand hand in hands){
            info = "handID" + hand.Id +" isright"+hand.IsRight+"\n";
            info += "Palm info (position:"+hand.PalmPosition+"\nVelocity:"+hand.PalmVelocity+"\n";
            info += "GrabStrenght:" + hand.GrabStrength + "  pinchStrength:" + hand.PinchStrength+"\n";
            List<Finger> fingers = hand.Fingers;
            foreach (Finger finger in fingers)
            {
                info += "finger " + finger.Type + " dirction" + finger.Direction + " extends is"+finger.IsExtended+"\n";
            }
            text.text = info;
        }
       
 }
}

 

ざっとこんな感じである。

テキストを用意してあるので、適当にアタッチしてもらうとそこに

情報が出るようにしてある。(片手のみなので注意(少し読みにくいかも))

 

f:id:shussy8:20161015230834p:plain

これを改良して色々なゲームを作っていきたいな~