2013-12-09 12 views
7

Leap Motion APIでは、サークル、スワイプ、キータップ、スクリーンタップの4つの標準ジェスチャーしかサポートしていません。私のアプリケーションでは、他のジェスチャーが必要ですが、どのように追加できますか、さらにジェスチャーを追加することが可能かどうかはわかりません。私はAPIを読んだが役に立たなかった。標準以外のLeap Motionジェスチャーはどのように実装できますか?

私のアプリケーションでは、オブジェクトを保持してドラッグできるようにします。それはLeap Motion APIを使用して可能ですか?もしそうなら、どうしたらいいですか?

+0

最初に、開発に使用しているラゲージは何ですか?ジェスチャーのx/y/z軸合わせを正確に勉強し、分析する必要があります。 – Larme

+0

Larmeは言うとおり、ここでは、あなたに手伝ってくれる情報をもう少し提供する必要があります。どのLeap Motion APIを使用していますか(JS、Objective-Cなど)?どのように人々はこのオブジェクト(指、手をつかむ)を保持するには?また、あなたの質問に貼り付けることによってシステムを試してみるのではなく、あなたが提示したテキストを読むべきです。 –

+0

OK、あなたの質問に言い換えて、最後にゴミを取り除いた。まだまだ広範なものですが、答えることは可能です。しかし、それはまだいくつかの詳細を持っているのに役立ちます。 –

答えて

8

ジェスチャーの開始点、処理、終了点を認識する独自のメソッドを作成する必要があります。

開始地点: あなたのプログラムはあなたが何かを保持しようとしていると認識しますか?私が考えることができる簡単なジェスチャーは、2本の指が1本の手のひらにリンクされていることです。フレームの中で、2本の指が1本の手のひらにつながっていて、指が10〜20mm離れていれば、それを把握するジェスチャーとして認識できます。これらの条件が満たされると、プログラムはジェスチャを認識し、これらの条件の中にコードを書くことができます。 C#で非常に醜い例えば

開始点: ブール= falseをgesture_detected。

Frame frame = controller.Frame(); 
HandList hands = controller.Hands; 

if (hands.Count == 1) 
{ 
    foreach (Hand hand in hands) 
    { 
     if (hand.fingers.Count == 2) 
     { 
      int fingerA_x,fingerB_x; 
      foreach (Finger finger in hand.fingers) 
      { 
       if(fingerA_x == 0) 
       { 
        fingerA_x = finger.x; 
       } else 
       { 
        fingerB_x = finger.x; 
       } 
      } 
     } 
    } 

    if((fingerA_x - fingerB_x) < 20) 
    { 
     //Gesture is detected. Do something... 
     gesture_detected = true; 
    } 
} 

プロセス: あなたのジェスチャーが何をしようとしていますか?移動したい場合は、ドラッグを行うためにマウスメソッドを呼び出す必要があります。 MOUSEEVENTF_LEFTDOWNイベントを使用して、PInvokeのC++でメソッドmouse_event()を検索します。

終了点: ドラッグが終了したら、終了したマウスドラッグをシミュレートするには、MOUSEEVENTF_LEFTUPのようなマウスメソッドイベントを呼び出す必要があります。しかし、ドラッグを止めるべきときに、あなたのプログラムはどのように検出しますか?最も論理的な方法は、フレーム内でジェスチャが検出されなくなった場合です。代わりのシナリオを処理するelse条件を記述します。

 if (!gesture_detected) 
     { 
      // Do something 
     } 
0

は、他のAPIのと同じようにカスタムクラスを定義するために、いくつかのリープモーションクラッセ(複数可)を導出する必要があった場合、ある時点で自分自身を不思議でしたが、あなたがする必要はありませんが判明しました。ここでは、C++の簡単な例、Leap Motionのネイティブ言語、カスタムジェスチャー定義、あなたの世界のすべてのキネマティックオブジェクトを大気中で持ち上げるLiftジェスチャーを紹介します。

ジェスチャー定義では、2つの目に見える手が必要です。両方とも手のひらで平らに開き、あらかじめ定義された(現在は推奨されていない)Leap Motion Swipeジェスチャーよりも遅く動くので、スワイプの場合は2つのジェスチャーの間に混乱はありませんジェスチャーは、Leap Motionコールバック関数void GestureListener::onConnect(const Leap::Controller& controller)で起動時に有効になっています。

例から分かるように、ジェスチャ定義は両手の法線と速度に制約を課すため、無作為に検出されることはありませんがあまり多くは検出されないため、妥当な努力を払って実行することができます。

// lift gesture: 2 hands open flat, both palms up and moving up slowly 
void LeapMotion::liftGesture(int numberHands, std::vector<glm::vec3> palmNormals, std::vector<glm::vec3> palmVelocities) { 

    if ((numberHands == 2) && 
     (palmNormals[0].x < 0.4f) && (palmNormals[1].x < 0.4f) && 
     (palmNormals[0].y > 0.9f) && (palmNormals[1].y > 0.9f) && 
     (palmNormals[0].z < 0.4f) && (palmNormals[1].z < 0.4f) && 
     (palmVelocities[0].z > 50.0f) && (palmVelocities[1].z > 50.0f) && 
     (palmVelocities[0].z < 300.0f) && (palmVelocities[1].z < 300.0f)) { 

     m_gesture = LIFT; 
     logFileStderr(VERBOSE, "\nLift gesture...\n"); 
    } 
}