2013-12-09 8 views
7

L'API Leap Motion supporta solo quattro gesti standard: cerchia, scorrimento, tocco tasti e tocco schermo. Nella mia applicazione ho bisogno di altri gesti, ma non so come posso aggiungerli o se è anche possibile aggiungere più gesti. Ho letto l'API e non è stato d'aiuto.In che modo è possibile implementare gesti Leap Motion non standard?

Nella mia applicazione voglio consentire all'utente di tenere un oggetto e trascinarlo. È possibile utilizzare l'API Leap Motion? Se è così, come posso fare questo?

+0

Primo: qual è il tuo linguaggio che stai utilizzando per sviluppare? Devi studiare esattamente l'asse x/y/z del tuo gesto e analizzarli. – Larme

+0

Come dice Larme, avremo bisogno di fornire un po 'più di informazioni qui per noi per aiutarti. Quale API di Leap Motion usi (JS, Objective-C, ecc.)? Come vuoi che la gente tenga questo oggetto (dito, mano che stringe)? Inoltre, dovresti leggere il testo che ti viene presentato, piuttosto che provare a giocare al sistema incollandolo nella tua domanda. –

+0

OK, ho riformulato la tua domanda e rimosso la spazzatura alla fine.È ancora un po 'ampio, ma è più vicino all'essere responsabile. Sarebbe comunque utile avere qualche dettaglio in più. –

risposta

8

Sarà necessario creare i propri metodi per riconoscere il punto di partenza, il processo e il punto finale di un gesto.

Punto di partenza: In che modo il programma riconosce che stai cercando di tenere qualcosa? Un semplice gesto che posso pensare è di 2 dita collegate con 1 palma. Quindi, nell'inquadratura, se vedi 2 dita collegate con 1 palmo e le dita sono forse distanti 10-20 mm, puoi riconoscerlo come un gesto per tenere qualcosa. Quando queste condizioni sono soddisfatte, il programma riconoscerà il gesto e potrai scrivere del codice all'interno di queste condizioni.

Per un bruttissimo esempio in C#:

Punto di partenza: booleano 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; 
    } 
} 

processo: Qual è il tuo gesto cercando di fare? Se vuoi muoverti, dovrai chiamare un metodo del mouse per fare un trascinamento. Cerca il metodo mouse_event() in C++ in PInvoke usando l'evento MOUSEEVENTF_LEFTDOWN.

Punto finale: Al termine del trascinamento, è necessario chiamare un evento del metodo del mouse come MOUSEEVENTF_LEFTUP per simulare il trascinamento del mouse terminato. Ma come verrà rilevato il tuo programma quando dovresti interrompere la resistenza? Il modo più logico è se il gesto non viene più rilevato nel frame. Quindi scrivi un'altra condizione per elaborare lo scenario alternativo.

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

Forse mi chiedo in un punto nel tempo se ci fosse la necessità di ricavare un po 'di Leap Motion classe (s) al fine di definire classi personalizzate come con altre API, scopre che non c'è bisogno di. Di seguito è riportato un breve esempio in C++, il linguaggio nativo di Leap Motion, di una definizione di gesto personalizzato, il gesto Lift che solleva nell'aria tutti gli oggetti cinematici del tuo mondo.

la definizione del gesto richiede 2 mani visibili, entrambi aperti con i palmi rivolti verso l'alto e più lenti rispetto al gesto Leap Motion Swipe predefinito (attualmente deprecato), quindi non c'è confusione tra i 2 movimenti nel caso lo Swipe il gesto è stato abilitato durante l'avvio nella funzione di callback Leap Motion void GestureListener::onConnect(const Leap::Controller& controller).

Come visto dall'esempio, la definizione del gesto impone vincoli su entrambe le mani, normali e velocità, quindi non verrà rilevata casualmente ma non troppe, quindi può ancora essere eseguita con qualche sforzo ragionevole.

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