8

Leap Motion API は、円、スワイプ、キータップ、画面タップの 4 つの標準ジェスチャのみをサポートしています。私のアプリケーションでは、他のジェスチャが必要ですが、それらを追加する方法や、さらにジェスチャを追加できるかどうかさえわかりません。API を読みましたが、役に立ちませんでした。

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

4

2 に答える 2

8

ジェスチャの開始点、プロセス、および終了点を認識する独自のメソッドを作成する必要があります。

出発点: プログラムは、何かを保持しようとしていることをどのように認識しますか? 私が考えることができる簡単なジェスチャーは、2 本の指が 1 つの手のひらにリンクされていることです。そのため、フレーム内で 1 つの手のひらに 2 本の指がリンクし、指が 10 ~ 20 mm 離れている場合、何かを保持するジェスチャーとして認識できます。これらの条件が満たされると、プログラムはジェスチャを認識し、これらの条件内にコードを記述できます。

C# での非常に醜い例:

出発点: ブール値の Gesture_detected = false;

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
       }
于 2013-12-16T14:18:29.850 に答える
0

ある時点で、他の API と同様にカスタム クラスを定義するために Leap Motion クラスを派生させる必要があるかどうか疑問に思っていましたが、そうする必要がないことがわかりました。以下は、カスタム ジェスチャ定義の Leap Motion ネイティブ言語である C++ での短い例です。これは、ワールド内のすべてのキネマティック オブジェクトを空中に持ち上げるリフト ジェスチャです。

ジェスチャの定義では、2 つの目に見える手が必要です。どちらも手のひらを上にして平らに開き、事前定義された (現在非推奨の) Leap Motion Swipe ジェスチャよりもゆっくりと上に移動するため、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");
    }
}
于 2017-05-15T04:29:17.923 に答える