kinect.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkel etalTracking); kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinec t_SkeletonFrameReady); Cdigo del evento SkeletonFrameReady: void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { foreach (SkeletonData skeleton in e.SkeletonFrame.Skeletons) if (skeleton.TrackingState == SkeletonTrackingState.Tracked) { Vector3 handRight = new Vector3(); handRight.X = skeleton.Joints[JointID.HandRight].Position.X; handRight.Y = skeleton.Joints[JointID.HandRight].Position.Y; handRight.Z = skeleton.Joints[JointID.HandRight].Position.Z; //Cdigo del detector } } Tambin hay que crear la estructura Vector3 para trabajar con las posiciones ms fcil mente aadiendo un campo ms para almacenar la fecha. [Serializable] public struct Vector3 { public float X; public float Y; public float Z; public DateTime date; } Deslizar Ya tenemos el proyecto listo para aadir el cdigo necesario para detectar gestos. P ero antes de eso vamos a ver qu gesto queremos detectar. Vamos a implementar la deteccin de Swipe o deslizamiento. Este gesto es simple, s e trata de mover la mano derecha hacia la derecha estando siempre a la misma alt ura y con una determinada velocidad. image Con esos factores podremos definir el gesto adecuadamente. Tenemos que tener el cuenta que para ello lo que vamos a hacer es ir comparando cada posicin que obten gamos del sensor con las sucesivas para saber si el gesto es el correcto o no. Los aspectos bsicos para reconocer el gesto sern que la altura de la mano sea pare cida, que el movimiento se realice a la derecha y que la longitud del movimiento sea suficiente para llegar a ser un Swipe. Implementar el reconocimiento Para poder identificar gestos vamos a necesitar 2 listas, una de tipo Vector3 pa ra almacenar las posiciones que vamos obteniendo y otra para llevar la cuenta de los gestos que hemos identificado. List<Vector3> positionList = new List<Vector3>(); List<Gesture> gestureAcceptedList = new List<Gesture>(); Despus crearemos las propiedades que usaremos para definir el gesto, para la long itud, ancho del y duracin del movimiento. Tambin tendremos otra propiedad para sab er cundo hemos detectado el ltimo gesto y otra por si queremos aadir un tiempo mnimo entre detecciones de gesto. Por ltimo un enumerado para nombrar los gestos. const float SwipeMinimalLength = 0.4f; const float SwipeMaximalHeight = 0.2f; const int SwipeMininalDuration = 250; const int SwipeMaximalDuration = 1500; DateTime lastGestureDate = DateTime.Now; int MinimalPeriodBetweenGestures = 0; public enum Gesture { None, Swipe }
Lo siguiente es crear la funcin que se va a encargar de recorrer la lista de posi ciones que tenemos e ir comprobando si existe un conjunto de ellas que pueda ser el gesto que queremos detectar. Entre estas comprobaciones se encuentran las mencionadas anteriormente de conser var la misma altura de la mano y direccin correcta de movimiento. Si cumple eso hay que comprobar si la longitud del gesto es la adecuada para ms t arde calcular los tiempos para saber si la velocidad es la idnea y entra dentro d el rango del periodo entre gestos ( en este caso el periodo entre gestos es 0). Por ltimo mostraremos que hemos detectado el gesto en una etiqueta, aadimos el ges to a la lista de gestos aceptados, asignamos la fecha de ahora a la propiedad co rrespondiente a la fecha del ltimo gestos detectado y borramos la lista de posici ones que tenemos. void Swipe() { int start = 0; for (int index = 0; index < positionList.Count-1; index++) { if ((Math.Abs(positionList[0].Y - positionList[index].Y) > Swipe MaximalHeight) || (positionList[index].X - positionList[index + 1].X > -0.01f)) { start = index; } if ((Math.Abs(positionList[index].X - positionList[start].X) > S wipeMinimalLength)) { double totalMilliseconds = (positionList[index].date- positi onList[start].date).TotalMilliseconds; if (totalMilliseconds >= SwipeMininalDuration && totalMillis econds <= SwipeMaximalDuration) { if (DateTime.Now.Subtract(lastGestureDate).TotalMillisec onds > MinimalPeriodBetweenGestures) { label1.Content = "Swipe "+ gestureAcceptedList.Count ; gestureAcceptedList.Add(Gesture.Swipe); lastGestureDate = DateTime.Now; positionList.Clear(); } } } } } Ahora aadimos la llamada en el evento SkeletonFrameReady en el lugar indicado don de aadiremos las posiciones a la lista de posiciones, llamaremos al detector de g estos y despus borraremos las posiciones sobrantes de la lista si hemos alcanzado el tope mximo que lo hemos puesto en 20. positionList.Add(new Vector3() { X = handRight.X, Y = handRight.Y, Z = handRight.Z, date = DateTime.Now } ); Swipe(); if (positionList.Count() > 20) { positionList.RemoveAt(0); }