====== Leap-Motion et paramètres gestuels ====== * Porteur(s) du projet : Blandine * Date : 21/01/2019 * Logiciel : Processing V3.4 * Fichiers : liens éventuels * Liens : Site officiel Leap-Motion [[https://developer.leapmotion.com/]] ; Librairie leap-motion à télécharger[[https://github.com/nok/leap-motion-processing ]] ===== Description ===== Découverte du capteur de mouvement « Leap Motion » à travers la conception d’une affiche interactive. Le leap motion est composé de **3 led et 2 caméras permettant de restituer les gestes de notre avant-bras.** Avec la librairie Processing leap motion, 3 exemples sont fournit : * LM_1_BASIC ([[http://tonerkebab.fr/wiki/doku.php/wiki:tutoriels:leap-motion:leap-motion|lien du tuto d'une ancienne étudiante]]) * LM_2_GESTURE (programme étudié) * LM_3_CAMERA ===== Objectif ===== Créer une affiche interactive avec le leap motion. Cette affiche permettrait au prospect de créer son propre dessin sans toucher un médium. ===== Leap-Motion gesture exemple ===== Le leap motion détecte plusieurs types de gestes de l’utilisateur, qu'il interprète comme un objet. * **Swipe -** Un long mouvement linéaire du doigt. * **Circle -** Un seul doigt traçant un cercle. * **Screen Tap -** Un tapotement du doigt comme s'il tapait sur un écran d'ordinateur vertical. * **Key Tap -** Un tapotement du doigt, comme si vous tapotiez sur une touche du clavier. {{ :wiki:tutoriels:leap-motion2:gestures_exemple.jpg?300 |}} Le programme exemple LM_2_GESTURES de la librairie Leap Motion n'affiche rien, il détecte seulement les gestes et leurs allouent des espaces mémoire. **Début du programme exemple LM_2_GESTURES** import de.voidplus.leapmotion.*; //importation de la librairie LeapMotion leap; // déclaration de l'objet leap motion void setup(){ size(800, 500); //taille de la fenêtre d'affichage background(255); //couleur d'arrière plan leap = new LeapMotion(this).allowGestures(); //Création de tout les gestes //leap = new LeapMotion(this).allowGestures("circle, swipe, screen_tap, key_tap"); //Création des gestes : cercle, swipe,screen_tap et Key_tap //leap = new LeapMotion(this).allowGestures("swipe"); //Création du geste Swipe uniquement } void draw(){ background(255); } **Début fonction de l'objet Swipe** void leapOnSwipeGesture(SwipeGesture g, int state){//analyse des paramètres d'actions/reconnaissance du geste (objet) Swipe int id = g.getId(); Finger finger = g.getFinger();//Objet Finger PVector position = g.getPosition();//Classe PVector décrivant la position des vecteurs de l'objet Swipe PVector positionStart = g.getStartPosition();//Classe PVector décrivant la position de DEPART des vecteurs de l'objet Swipe PVector direction = g.getDirection();//Classe PVector décrivant le balayage directionnel des vecteurs (gauche-droite) de l'objet Swipe (parallèle au mouvement de balayage) float speed = g.getSpeed();//vitesse du geste en ms long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long : stock les grands entiers sur 64 bits (32bits pour les type int) utilisé pour stocker plus d'int sur la durée du geste float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float (nous avons moins d'infos à stocker) switch(state){//états du gestes swipe en trois parties : debut/milieu/fin (different de gesture type = type de geste auxquels sont attribué une valeur) relatif à la console case 1://les données du geste sont recupérées break; case 2://Le geste est en cour de dessin break; case 3:// Fin/arret du geste println("SwipeGesture: " + id);//inscription du geste dans la console (paramètre de sortie) break; } } **Début fonction de l'objet Circle** void leapOnCircleGesture(CircleGesture g, int state){//analyse des paramètres d'actions/reconnaissance du geste (objet) Circle int id = g.getId(); Finger finger = g.getFinger();//Objet Finger PVector positionCenter = g.getCenter();//Stockage de la position centrale du geste float radius = g.getRadius();//Rayon de l'objet Circle de type float float progress = g.getProgress();//Nombre de fois ou l'objet est repassé par le bout du doight long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float int direction = g.getDirection(); switch(state){//même principe que SWipe gesture case 1://Start, début break; case 2://Update, milieu break; case 3://Stop, fin println("CircleGesture: " + id);//inscription de ces étapes dans la console (paramètre de sortie) break; } switch(direction){//2 état du geste circle case 0://Anticlockwise/Left gesture/Geste commencé par la gauche, soit fait à l'inverse du sens des aiguilles d'une montre break; case 1://Clockwise/Right gesture//Geste commencé par la droite, soit dans le sens des aiguille d'une montre break; } } **Début fonction de l'objet ScreenTap** void leapOnScreenTapGesture(ScreenTapGesture g){//analyse des paramètres d'actions/reconnaissance du geste (objet) ScreenTap int id = g.getId(); Finger finger = g.getFinger();//Objet Finger PVector position = g.getPosition();//Classe PVector décrivant la position des vecteurs de l'objet ScreenTap PVector direction = g.getDirection();//Classe PVector décrivant le balayage directionnel des vecteurs (gauche-droite) de l'objet ScreenTap long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float println("ScreenTapGesture: " + id);//inscription du geste effectué dans la console (paramètre de sortie) } **Début fonction de l'objet Key Tap** void leapOnKeyTapGesture(KeyTapGesture g){//analyse des paramètres d'actions/reconnaissance du geste (objet) Keytap int id = g.getId(); Finger finger = g.getFinger();//Objet Finger PVector position = g.getPosition();//Classe PVector décrivant la position des vecteurs de l'objet Keytap PVector direction = g.getDirection();//Classe PVector décrivant le balayage directionnel des vecteurs (gauche-droite) de l'objet Keytap long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float println("KeyTapGesture: " + id);//inscription du geste effectué dans la console (paramètre de sortie) } Fin du programme LM_2_GESTURES ===== Programme de dessin ===== L’affiche interactive permet de dessiner sans toucher. L’intégration de la librairie pdf offre la possibilité avec un geste clé (Swipe gesture) d’arrêter le programme. Cet arrêt créer une sauvegarde pdf du dessin, imprimable par la suite. **Début description programme de l'affiche** import processing.pdf.*;//importation librairie PDF import de.voidplus.leapmotion.*;//importation librairie leap motion LeapMotion leap;//déclaration de l'objet void setup() { size(1080, 720);//taille fenetre d'affichage smooth(10);//lissage des tracés leap = new LeapMotion(this);//création de l'objet leap = new LeapMotion(this).allowGestures("swipe");//créer l'objet SWIPE beginRecord(PDF, "leap.pdf");//type d'export .pdf fill(238,222,258);//rectangle fond & couleur rose rect(100, 100,880, 520); } **Création d'une boucle for pour dessiner les doigts** void draw() { for (Finger finger : leap.getFingers ()) {//créer l'objet main finger.drawBones();//dessin du squellette } } **Déclaration de la méthode SWIPE, ayant pour instruction de couper le programme lors du geste** void leapOnSwipeGesture(SwipeGesture g, int state) { endRecord();//fin enregistrement exit();//fin du programme } ===== Finale ===== {{:wiki:tutoriels:leap-motion2:leap_video.mp4|}} {{ :wiki:tutoriels:leap-motion2:screenshot_2019-01-21_at_12.27.20.png?300 |}} {{ :wiki:tutoriels:leap-motion2:screenshot_2019-01-21_at_12.25.22.png?300 |}} Le programme s'arrête et créer un pdf dans le dossier du programme. > Pistes future : exploiter d'avantage l'exemple gesture afin attribuer une forme de dessin à chaque geste.