diff -r d40f84d77db4 -r 93dfb08dcc97 middleware/src/Tracking/KinectMain.cs --- a/middleware/src/Tracking/KinectMain.cs Mon Mar 19 10:21:56 2012 +0100 +++ b/middleware/src/Tracking/KinectMain.cs Mon Mar 19 18:24:59 2012 +0100 @@ -56,6 +56,8 @@ public delegate void PushHandler(object o, PushEventArgs e); //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump. public delegate void JumpHandler(object o, JumpEventArgs e); + //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité. + public delegate void UserPositionHandler(object o, UserPositionEventArgs e); public class KinectMain { @@ -74,10 +76,15 @@ private PushDetector pushDetector; //Détecteur de jumps. private JumpDetector jumpDetector; + //Détecteur de proximité. + private UserPositionDetector userPositionDetector; //Distances min/max délimitant le champ de recherche. private float minDistHands; private float maxDistHands; + private float minDist; + private float maxDist; + private float zeroPoint; //Temps de rafraichissement pour le timer (Détection de gesture dans le serveur TUIO). private int timerElapsing; @@ -96,6 +103,8 @@ public static event PushHandler PushEvent; //L'événement jump. public static event JumpHandler JumpEvent; + //L'événement l'utilisateur se déplace dans la zone de détection. + public static event UserPositionHandler UserPositionEvent; private string connexionHost; private int connexionPort; @@ -112,24 +121,29 @@ //On crée la fenêtre de debug. debug = new Debug.DebugWindow(this); - //On crée les détecteurs de gestes. - swipeDetector = new SwipeDetector(debug); - pushDetector = new PushDetector(debug); - jumpDetector = new JumpDetector(debug); - //On tente de charger les paramètres du fichier params.ini. //Si on n'y arrive pas, on affiche une erreur et on charge les paramètres par défaut. if (!loadParameters()) { debug.ExceptionLbl.Content = rm.GetString("loadParametersFail"); //Distances de détection des mains par défaut pour la recherche (ici de 1m à 2m de la Kinect). - minDistHands = (float)1.0; - maxDistHands = (float)1.5; + minDistHands = 1.0f; + maxDistHands = 1.5f; + minDist = 1.0f; + maxDist = 4.0f; + zeroPoint = 1.7f; connexionHost = "127.0.0.1"; connexionPort = 80; timerElapsing = 1000; } + //On crée les détecteurs de gestes. + swipeDetector = new SwipeDetector(debug); + pushDetector = new PushDetector(debug); + jumpDetector = new JumpDetector(debug); + //On crée le détecteur de proximité. + userPositionDetector = new UserPositionDetector(debug, minDist, maxDist, zeroPoint, minDistHands, maxDistHands); + //On affiche la fenêtre de debug. try { @@ -211,6 +225,10 @@ JumpListener jumpListener = new JumpListener(); JumpEvent += new JumpHandler(jumpListener.ShowOnScreen); + //Fonction appelée lorsque l'utilisateur se déplace dans la zone de détection. + UserPositionListener userPositionListener = new UserPositionListener(); + UserPositionEvent += new UserPositionHandler(userPositionListener.ShowOnScreen); + //On connecte le serveur à l'adresse locale sur le port 80. server = new Server(connexionHost, connexionPort, timerElapsing, debug); } @@ -352,12 +370,6 @@ joints.Insert((int)JointType.AnkleRight, ankleRight); joints.Insert((int)JointType.FootRight, footRight); GestureDetector.UpdateSkeletonHistory(joints); - - //On obtient sa distance à la Kinect. - float distance = first.Position.Z; - - //On affiche la distance dans le debug. - debug.showDistance(distance); //Si la main gauche est dans le champ, on lance l'événement approprié. if (handLeft.Position.Z < maxDistHands && handLeft.Position.Z > minDistHands) @@ -420,6 +432,41 @@ OnJumpEvent(jumpEvent); }*/ + //Si l'utilisateur se déplace dans la zone de détection. + //On traite le problème en plusieurs limites, on discrétise la zone. + if(first.TrackingState == SkeletonTrackingState.Tracked) + { + float proximity = userPositionDetector.CalcProximity(first.Position.Z); + /*if (proximity > 0f && proximity < 25f) + { + Console.Out.WriteLine("1/4"); + + } + else if (proximity > 25f && proximity < 50f) + { + Console.Out.WriteLine("1/2"); + + } + else if (proximity > 50f && proximity < 75f) + { + Console.Out.WriteLine("3/4"); + + } + else if (proximity == 100f) + { + Console.Out.WriteLine("TRUE"); + + }*/ + + if (proximity > 0f) + { + UserPositionEventArgs userPositionEvent = new UserPositionEventArgs(debug, server, proximity); + OnUserPositionEvent(userPositionEvent); + } + else + Console.Out.WriteLine("FAIL"); + } + //Dessine le squelette dans le debug. debug.drawJoints(first.Joints, first); debug.showSkeleton(hipCenter, spine, shoulderCenter, head, shoulderLeft, elbowLeft, wristLeft, handLeft, shoulderRight, elbowRight, wristRight, handRight, hipLeft, kneeLeft, ankleLeft, footLeft, hipRight, kneeRight, ankleRight, footRight); @@ -498,6 +545,16 @@ } /* + * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se déplace + * dans la zone de détection. + */ + public static void OnUserPositionEvent(UserPositionEventArgs e) + { + if (UserPositionEvent != null) + UserPositionEvent(new object(), e); + } + + /* * Méthode de chargement des paramètres (position du champ de recherche...). */ public bool loadParameters() @@ -506,6 +563,9 @@ { minDistHands = (float)double.Parse(ConfigurationManager.AppSettings["searchMinDistance"]); maxDistHands = (float)double.Parse(ConfigurationManager.AppSettings["searchMaxDistance"]); + minDist = (float)double.Parse(ConfigurationManager.AppSettings["minDistance"]); + maxDist = (float)double.Parse(ConfigurationManager.AppSettings["maxDistance"]); + zeroPoint = (float)double.Parse(ConfigurationManager.AppSettings["zeroPoint"]); connexionHost = ConfigurationManager.AppSettings["connexionHost"]; connexionPort = int.Parse(ConfigurationManager.AppSettings["connexionPort"]); timerElapsing = int.Parse(ConfigurationManager.AppSettings["timerElapsing"]); @@ -514,8 +574,10 @@ { return false; } - - if (maxDistHands <= 0 || minDistHands <= 0 || maxDistHands > 4 || minDistHands > 4 || minDistHands >= maxDistHands) + + if (maxDistHands <= 0f || minDistHands <= 0f || maxDistHands > maxDist || minDistHands > maxDist || + minDistHands >= maxDistHands || zeroPoint < maxDistHands || minDistHands < minDist || + zeroPoint >= maxDist || connexionPort < 0 || timerElapsing < 0) { debug.ExceptionLbl.Content = rm.GetString("loadParametersIncorrect"); return false; @@ -528,6 +590,8 @@ */ public void updateParameters() { + userPositionDetector.setParams(minDist, maxDist, minDistHands, maxDistHands, zeroPoint); + //On récupère la config. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //On met à jour. @@ -535,6 +599,12 @@ config.AppSettings.Settings.Add("searchMinDistance", minDistHands.ToString()); config.AppSettings.Settings.Remove("searchMaxDistance"); config.AppSettings.Settings.Add("searchMaxDistance", maxDistHands.ToString()); + config.AppSettings.Settings.Remove("minDistance"); + config.AppSettings.Settings.Add("minDistance", minDist.ToString()); + config.AppSettings.Settings.Remove("maxDistance"); + config.AppSettings.Settings.Add("maxDistance", maxDist.ToString()); + config.AppSettings.Settings.Remove("zeroPoint"); + config.AppSettings.Settings.Add("zeroPoint", zeroPoint.ToString()); config.AppSettings.Settings.Remove("connexionHost"); config.AppSettings.Settings.Add("connexionHost", connexionHost); config.AppSettings.Settings.Remove("connexionPort");