La primera parte fué comprender el código de BodyBasics, en él realiza un tracking de las personas que se encuentren delante de Kinect y las pinta representando los huesos y articulaciones, de la siguiente forma:
FIgura 1:
BodyBasics2D representa las articulaciones del cuerpo en cuestión como joints, y entre los joints crea líneas representando las distintas partes del cuerpo. Las líneas que se ven en la Figura 1 son bones, creados a partir de parejas de tipos de Joint (JointType).
// Torso
this.bones.Add(new Tuple<JointType, JointType>(JointType.Head, JointType.Neck));
this.bones.Add(new Tuple<JointType, JointType>(JointType.Neck, JointType.SpineShoulder));
this.bones.Add(new Tuple<JointType, JointType>(JointType.SpineShoulder, JointType.SpineMid));
this.bones.Add(new Tuple<JointType, JointType>(JointType.SpineMid, JointType.SpineBase));
this.bones.Add(new Tuple<JointType, JointType>(JointType.SpineShoulder, JointType.ShoulderRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.SpineShoulder, JointType.ShoulderLeft));
this.bones.Add(new Tuple<JointType, JointType>(JointType.SpineBase, JointType.HipRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.SpineBase, JointType.HipLeft));
// Brazo Derecho
this.bones.Add(new Tuple<JointType, JointType>(JointType.ShoulderRight, JointType.ElbowRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.ElbowRight, JointType.WristRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.WristRight, JointType.HandRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.HandRight, JointType.HandTipRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.WristRight, JointType.ThumbRight));
// Brazo Izquierdo
this.bones.Add(new Tuple<JointType, JointType>(JointType.ShoulderLeft, JointType.ElbowLeft));
this.bones.Add(new Tuple<JointType, JointType>(JointType.ElbowLeft, JointType.WristLeft));
this.bones.Add(new Tuple<JointType, JointType>(JointType.WristLeft, JointType.HandLeft));
this.bones.Add(new Tuple<JointType, JointType>(JointType.HandLeft, JointType.HandTipLeft));
this.bones.Add(new Tuple<JointType, JointType>(JointType.WristLeft, JointType.ThumbLeft));
// Pierna derecha
this.bones.Add(new Tuple<JointType, JointType>(JointType.HipRight, JointType.KneeRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.KneeRight, JointType.AnkleRight));
this.bones.Add(new Tuple<JointType, JointType>(JointType.AnkleRight, JointType.FootRight));
// Pierna izquierda
this.bones.Add(new Tuple<JointType, JointType>(JointType.HipLeft, JointType.KneeLeft));
this.bones.Add(new Tuple<JointType, JointType>(JointType.KneeLeft, JointType.AnkleLeft));
this.bones.Add(new Tuple<JointType, JointType>(JointType.AnkleLeft, JointType.FootLeft));
En este código podemos ver como crea bones, una pareja de tipos de Joints, para después pintar el esqueleto en pantalla. El dibujado del cuerpo entero se lleva a cabo en DrawBody. Esto nos ha sido muy útil para poder saber las posición de los Joints a la hora de probar la aplicación. Además del dibujado del cuerpo, viene en BodyBasics también un rectángulo dibujado que encuadran los bodies dibujados, esto se hace con la función DrawRectangle de Drawing Context.
dc.DrawRectangle(Brush.White, null, new Rect(0.0, 0.0, this.displayWidth, this.displayHeight));
Con esa función estamos dibujando un rectángulo de color blanco con un tamaño displayWidth y displayHeight predefinidos anteriormente. Ese cuadrado va a permitir a los bodies dibujados están dentro de un entorno definido y moverse por él. En nuestro caso hemos utilizado este método pero en lugar de utilizar un Brush con un color predefinido hemos creado un color con una imagen como textura. Para poder crear texturas a partir de imágenes podemos utilizar este código.
ImageBrush <nombre> = new ImageBrush(new BitmapImage(new Uri(“PATH IMAGEN”)));
Una vez visto como se dibuja el cuerpo y el entorno en el que se mueve, vamos a explicar la función en la que se ejecuta el código que hemos incluido en este ejemplo.
private void Reader_FrameArrived(object sender, BodyFrameArrivedEventArgs e){}
En esta función es donde definimos la lista de cuerpos que estamos detectando y cada vez que se recibe un frame se ejecuta la segunda parte de la función, donde ejecutaremos los dibujados y controlaremos el flujo de la aplicación (if (dataReceived)).
Una vez definido el drawingContext, dependiendo de la fase en la que estamos de la aplicación (fase 1 empezar tocando el yinyang, fase 2 para poner la primera postura, fase 3 para poner la segunda postura y fase 4 para finalizar la aplicación) definiremos un brush basado en texturas de los diferentes fondos que hemos preparado con texto para interaccionar con el usuario y dar las instrucciones de la aplicación):
Después de esta parte que hemos añadido nosotros, se crean para cada cuerpo un diccionario de tipos de Joint y las coordenadas del Joint(x,y) que nos será de mucha utilidad posteriormente. Una vez disponemos del diccionario jointPoints comenzamos a buscar las posturas y otras funciones para la aplicación.