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