2013-12-09 4 views
7

Die Leap Motion-API unterstützt nur vier Standardgesten: Kreis-, Swipe-, Tasten- und Bildschirmtipp. In meiner Anwendung brauche ich andere Gesten, aber ich weiß nicht, wie ich sie hinzufügen kann oder ob es sogar möglich ist, mehr Gesten hinzuzufügen. Ich habe die API gelesen und es war keine Hilfe.Wie können Sie nicht standardmäßige Leap Motion-Gesten implementieren?

In meiner Anwendung möchte ich dem Benutzer erlauben, ein Objekt zu halten und ziehen Sie es. Ist das mit der Leap Motion API möglich? Wenn ja, wie kann ich das tun?

+0

Zuerst: Was ist Ihre Sprache, die Sie verwenden, um zu entwickeln? Sie müssen genau die x/y/z-Achse Ihrer Geste studieren und analysieren. – Larme

+0

Wie Larme sagt, müssen Sie hier ein wenig mehr Informationen bereitstellen, damit wir Ihnen helfen können. Welche API von Leap Motion verwenden Sie (JS, Objective-C usw.)? Wie wollen Sie, dass Menschen dieses Objekt halten (Finger, Hand greifen)? Außerdem sollten Sie den Text lesen, der Ihnen präsentiert wird, anstatt zu versuchen, das System zu spielen, indem Sie in Ihre Frage einfügen. –

+0

OK, ich habe deine Frage umformuliert und den Müll am Ende entfernt.Es ist immer noch ein bisschen breit, aber es ist näher dran, verantwortlich zu sein. Es würde jedoch helfen, ein paar weitere Details zu haben. –

Antwort

8

Sie müssen Ihre eigenen Methoden erstellen, um den Startpunkt, den Prozess und den Endpunkt einer Geste zu erkennen.

Ausgangspunkt: Wie erkennt Ihr Programm, dass Sie versuchen, etwas zu halten? Eine einfache Geste, die mir einfällt, sind 2 Finger, die mit 1 Handfläche verbunden sind. Wenn Sie also im Rahmen zwei Finger sehen, die mit einer Handfläche verbunden sind und die Finger etwa 10-20 mm voneinander entfernt sind, können Sie dies als Geste erkennen, etwas zu halten. Wenn diese Bedingungen erfüllt sind, erkennt das Programm die Geste und Sie können innerhalb dieser Bedingungen Code schreiben.

Für ein sehr hässliches Beispiel in C#:

Ausgangspunkt: Boolean 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; 
    } 
} 

Prozess: Was Ihre Geste zu tun versuchen, ist? Wenn Sie sich bewegen möchten, müssen Sie eine Mausmethode aufrufen, um einen Ziehen auszuführen. Suchen Sie nach der Methode mouse_event() in C++ unter PInvoke mit dem Ereignis MOUSEEVENTF_LEFTDOWN.

Endpunkt: Nachdem Sie den Mauszeiger gezogen haben, müssen Sie ein Mausmethodenereignis wie MOUSEEVENTF_LEFTUP aufrufen, um einen gezogenen Mauswiderstand zu simulieren. Aber wie erkennt Ihr Programm, wann Sie den Widerstand stoppen sollten? Am logischsten ist es, wenn die Geste im Rahmen nicht mehr erkannt wird. Schreiben Sie also eine andere Bedingung, um das alternative Szenario zu verarbeiten.

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

habe mich in der Zeit an einem Punkt fragen, ob es eine Notwendigkeit, einige Leap Motion classe (n) abzuleiten, um benutzerdefinierte Klassen war wie bei anderen API zu definieren, stellt sich heraus, Sie müssen nicht. Hier unten ist ein kurzes Beispiel in C++, der Sprache von Leap Motion, einer benutzerdefinierten Gesten-Definition, der Lift-Geste, die alle kinematischen Objekte in Ihrer Welt in die Luft hebt.

Die Gesten-Definition erfordert 2 sichtbare Hände, beide offen flach mit nach oben gerichteten Handflächen und langsamer als die vordefinierte (derzeit veraltete) Leap Motion Swipe-Geste, so dass es keine Verwechslung zwischen den 2 Gesten beim Swipe gibt Geste wurde während des Starts in der Leap Motion Callback-Funktion void GestureListener::onConnect(const Leap::Controller& controller) aktiviert.

Wie aus dem Beispiel hervorgeht, legt die Gestendefinition Beschränkungen für die Normalen und Geschwindigkeiten der Hände fest, so dass sie nicht zufällig, aber nicht zu viele erkannt werden und daher mit vertretbarem Aufwand ausgeführt werden können.

// 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"); 
    } 
}