middleware/Tracking/Gestures/JumpDetector.cs
changeset 39 15b11d291417
parent 37 37ebedd84755
equal deleted inserted replaced
38:08f96aad0127 39:15b11d291417
     1 /*
     1 /*
     2 * This file is part of the TraKERS\Middleware package.
     2 * This file is part of the TraKERS\Middleware package.
     3 *
     3 *
     4 * (c) IRI <http://www.iri.centrepompidou.fr/>
     4 * (c) IRI <http://www.iri.centrepompidou.fr/>
     5 *
     5 *
     6 * For the full copyright and license information, please view the LICENSE
     6 * For the full copyright and license information, please view the LICENSE
    15  * 
    15  * 
    16  * Auteur : alexandre.bastien@iri.centrepompidou.fr
    16  * Auteur : alexandre.bastien@iri.centrepompidou.fr
    17  * 
    17  * 
    18  * Fonctionnalités : Permet de détecter si l'utilisateur a sauté, en se basant sur
    18  * Fonctionnalités : Permet de détecter si l'utilisateur a sauté, en se basant sur
    19  * des règles appliquées à la positions des noeuds dans le temps.
    19  * des règles appliquées à la positions des noeuds dans le temps.
    20  * 
       
    21  * P.S : Cette partie est encore en développement.
       
    22  */
    20  */
    23 
    21 
    24 using System;
    22 using System;
    25 using System.Collections.Generic;
    23 using System.Collections.Generic;
    26 using System.Linq;
    24 using System.Linq;
    53             
    51             
    54             //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste.
    52             //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste.
    55             if (localHistory.Count < indexesToCheck)
    53             if (localHistory.Count < indexesToCheck)
    56                 return false;
    54                 return false;
    57 
    55 
    58             /* (HeadBelowBaseLine || LeftKneeBelowBaseLine || RightKneeBelowBaseLine ||
       
    59              * LeftAnkleBelowBaseLine || RightAnkleBelowBaseLine || BodyFaceUpwards
       
    60              * 
       
    61              * NOT
       
    62              * 
       
    63              * AND
       
    64              * 
       
    65              * HeadAboveBaseLine && LeftKneeAboveBaseLine && RightKneeAboveBaseLine &&
       
    66              * LegsStraightPreviouslyBent)
       
    67              * 
       
    68              * OR
       
    69              * 
       
    70              * HeadFarAboveBaseLine
       
    71              */
       
    72 
       
    73             //La distance de référence est ici la distance entre les épaules et les hanches.
    56             //La distance de référence est ici la distance entre les épaules et les hanches.
    74             refDistance = Math.Abs(localHistory[0][(int)JointType.ShoulderCenter].Position.Y - localHistory[0][(int)JointType.HipCenter].Position.Y);
    57             refDistance = Math.Abs(localHistory[0][(int)JointType.ShoulderCenter].Position.Y - localHistory[0][(int)JointType.HipCenter].Position.Y);
    75             //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
    58             //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
    76 
    59 
    77             int beginIdx = localHistory.Count - indexesToCheck + 1;
    60             int beginIdx = localHistory.Count - indexesToCheck + 1;
    86             {
    69             {
    87                 if (localHistory[i][(int)JointType.Spine].Position.Y + refDistance / 2 < localHistory[beginIdx][(int)JointType.Spine].Position.Y)
    70                 if (localHistory[i][(int)JointType.Spine].Position.Y + refDistance / 2 < localHistory[beginIdx][(int)JointType.Spine].Position.Y)
    88                 {
    71                 {
    89                     topOfJump = true;
    72                     topOfJump = true;
    90                     middleIdx = i;
    73                     middleIdx = i;
    91                     debug.onR0(true);
       
    92                 }
       
    93 
       
    94                 if (localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[beginIdx][(int)JointType.Spine].Position.Y)
       
    95                 {
       
    96                     debug.onR0(false);
       
    97                     debug.onR1(false);
       
    98                     debug.onR2(false);
       
    99                 }
    74                 }
   100             }
    75             }
   101 
    76 
   102             if (topOfJump)
    77             if (topOfJump)
   103             {
    78             {
   106                     if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Y - localHistory[i][(int)JointType.Spine].Position.Y) < refDistance / 5 ||
    81                     if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Y - localHistory[i][(int)JointType.Spine].Position.Y) < refDistance / 5 ||
   107                         localHistory[beginIdx][(int)JointType.Spine].Position.Y < localHistory[i][(int)JointType.Spine].Position.Y)
    82                         localHistory[beginIdx][(int)JointType.Spine].Position.Y < localHistory[i][(int)JointType.Spine].Position.Y)
   108                     {
    83                     {
   109                         probableJump = true;
    84                         probableJump = true;
   110                         endIdx = i;
    85                         endIdx = i;
   111                         debug.onR1(true);
       
   112                         //Console.Out.WriteLine("TOP");
       
   113                     }
    86                     }
   114                 }
    87                 }
   115             }
    88             }
   116             else
    89             else
   117             {
    90             {
   118                 debug.onR0(false);
    91                 //On supprime l'historique local.
   119                 debug.onR1(false);
    92                 localHistory.Clear();
   120                 debug.onR2(false);
       
   121                 return false;
    93                 return false;
   122             }
    94             }
   123 
    95 
   124             if (probableJump)
    96             if (probableJump)
   125             {
    97             {
   126                 if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Z - localHistory[endIdx][(int)JointType.Spine].Position.Z) < 0.10)
    98                 if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Z - localHistory[endIdx][(int)JointType.Spine].Position.Z) < 0.10)
   127                 {
    99                 {
   128                     debug.onR2(true);
   100                     //On supprime l'historique local.
       
   101                     localHistory.Clear();
   129                     return true;
   102                     return true;
   130                 }
   103                 }
   131             }
   104             }
   132             else
   105             else
   133             {
   106             {
   134                 debug.onR0(false);
   107                 //On supprime l'historique local.
   135                 debug.onR1(false);
   108                 localHistory.Clear();
   136                 debug.onR2(false);
       
   137                 return false;
   109                 return false;
   138             }
   110             }
   139                 
       
   140                 //if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y && !topOfJump)
       
   141                     //return false;
       
   142 
       
   143                 //Si la position Y de la main est plus haute que la tête
       
   144                 //OU si la position Y de la main est plus basse que la hanche
       
   145                 //OU si la nouvelle position Z de la main est moins profonde que la précédente
       
   146                 //OU si la nouvelle position X de la main est plus éloignée de la distance N par rapport à la première position X
       
   147                 //OU si la nouvelle position Y de la main est plus éloignée de la distance N par rapport à la première position Y
       
   148                 //Alors la main en question ne fait pas de push.
       
   149                 /*if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y &&
       
   150                     topOfJump || localHistory[i - 1][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.HandRight].Position.Y &&
       
   151                     !topOfJump)
       
   152                     return false;*/
       
   153             //}
       
   154 
       
   155             //Console.Out.WriteLine("OK");
       
   156 
       
   157             //Si la distance en Z du geste a été plus courte que la distance N
       
   158             //Alors on retourne faux.
       
   159             //float dist = (localHistory[localHistory.Count - 1][handRightID].Position.X - localHistory[localHistory.Count - indexesToCheck][handRightID].Position.X);
       
   160 
       
   161             //Console.WriteLine(Math.Abs(localHistory[0][handLeftID].Position.Z - localHistory[localHistory.Count - indexesToCheck][handLeftID].Position.Z) * 100 + " " + refDistance);
       
   162 
       
   163             //Si la dernière position de la main droite/gauche est sur le côté gauche/droit du corps
       
   164             //OU si la première position calculée de la main droite/gauche est sur le côté gauche/droit du corps
       
   165             //Alors on retourne faux.
       
   166             
   111             
   167             //On supprime l'historique local.
   112             //On supprime l'historique local.
   168             
   113             localHistory.Clear();
   169             return false;
   114             return false;
   170         }
   115         }
   171     }
   116     }
   172 }
   117 }