Kinect (mano derecha)

En este ejemplo de programa HOST se pinta un circulo rojo que se mueve sincronamente a la mano del usuario detectado mediante sensor kinect

 

Fichero displays.xml

<xml>
<virtualDisplay width="1280" height="768"> 
 <display id="1" x="0" y="0" width="1280" height="768" />   
</virtualDisplay>
</xml>

Fichero TUIML.xml

<juguemos>
 <token name="kinect2">
    <constraint name="todo" type= "2D" list_vertex="0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0">
       <tac subtoken="manoDerecha"/>
    </constraint> 
    <subtoken idG = "manoDerecha"/>
 </token> 
</juguemos>

Codigo Host en Proccessing

int ANCHO=1280; //definir valores segun tamaño pantalla destino
int ALTO=768;

TACAPI miAPI;
DisplaysHost displaysClient;

float rightX = 0;
float rightY = 0;


void setup() {
 
 // Keystone will only work with P3D or OPENGL renderers, 
 // since it relies on texture mapping to deform
 //fullScreen( P3D);
 size(80, 60, P3D); 
 frameRate(16);
 
 //definicion de la API
 miAPI = new TACAPI();
 
 //virtual screens
 displaysClient = new DisplaysHost("host"); 
 
}


void draw() {
 //Programacion Juego 
 displaysClient.beginDraw(); 
 //los valores de mapeo dependeran de la posicion de Kinect, el usuario y las dimensiones fisicas de la pantalla activa
 float manoX=map(rightX, 100, 1200, 550, 1000);
 float manoY=map(rightY, 10, 750, 250, 750);
 displaysClient.elipse(manoX, manoY, 50,50, 255, 100,100, 255);
 displaysClient.escribir("X="+rightX, ANCHO/2, ALTO/2, 20, 255, 255, 255, 255);
 displaysClient.endDraw();
 
}

void eventoTAC(TAC ta) {
 //tratamiento de tacs
 ta.info();
 if(ta.getTokenName().equals("kinect2") && ta.getSubtokenName().equals("manoDerecha") && ta.getManipulacion().equals("move")) {
 rightX = ta.getValores().get(0)*ANCHO;
 rightY = ta.getValores().get(1)*ALTO;
 println("rightx=", rightX);
 
 
 }
}

void mensajeRecibido(OscMessage theOscMessage) {
 //tratamiento mensaje osc
}

void keyPressed() {
 switch(key) { 
 case ESC: 
 displaysClient.disconnect();
 super.stop();
 break; 
 }
}

Retos de aprendizaje

  1. Dibujar otro circulo en otro color para la mano izquierda
  2. añadir una segunda persona
  3. Añadir tantas personas como sean detectadas por kinect
  4. Añadir un segundo sensor kinect para una nueva pantalla

 


Documentación

  • elipse

Este método permite dibujar una elipse del color especificado, con o sin contorno ( del color que se indique) y del tamaño que se desee. Los parámetros que recibe son los siguientes:

float x: posición del centro de la elipse en el eje X (2D).

float y: posición del centro de la elipse en el eje Y (2D).

int ancho: anchura de la elipse que se va a dibujar.

int alto: altura de la elipse que se va a dibujar.

int rrell: valor de la componente rojo del color con el que se pintará el relleno de la elipse. Valores: 0-255.

int grell: valor de la componente verde del color con el que se pintará el relleno de la elipse. Valores: 0-255.

int brell: valor de la componente azul del color con el que se pintará el relleno de la elipse. Valores: 0-255.

int alpharell: opacidad del relleno de la elipse que se va a dibujar. Valores: 0 (transparente) – 255 (opaco)

int grosor (OPCIONAL): grosor del contorno de la elipse a dibujar.

int rcon (OPCIONAL): valor de la componente rojo del color con el que se pintará el contorno de la elipse. Valores: 0-255.

int gcon (OPCIONAL): valor de la componente verde del color con el que se pintará el contorno de la elipse. Valores: 0-255.

int bcon (OPCIONAL): valor de la componente azul del color con el que se pintará el contorno de la elipse. Valores: 0-255.

int alphacon (OPCIONAL): opacidad del contorno de la elipse a dibujar. Valores: 0 (transparente) – 255 (opaco).

  • escribir

Este método permite escribir texto de tamaño y color solicitados. Los parámetros que recibe este método son los siguientes:

String texto: texto que se desea escribir en pantalla.

float x: posición de la esquina superior izquierda del texto en el eje X (2D).

float y: posición de la esquina superior izquierda del texto en el eje Y (2D).

int tamagno: tamaño del texto que se escribirá en pantalla.

int r: valor de la componente rojo del color con el que se escribirá el texto. Valores: 0-255.

int g: valor de la componente verde del color con el que se escribirá el texto. Valores: 0-255.

int b: valor de la componente azul del color con el que se escribirá el texto. Valores: 0-255.

int alpha: opacidad del texto a escribir. Valores: 0 (transparente) – 255 (opaco).

  • Clase TAC

A continuación se presenta la clase TAC con sus diversas funciones:

ATRIBUTOS

String tokenName: Token al que pertenece el tac. Si el token es un sensor, <tokenName> es el nombre del sensor (tabletop, kinect…). Si el token es un objeto con áreas asociadas, <tokenName> = idG_Objeto + “_” + idS_Objeto

String consName: Nombre del constraint

String manipulación: Valor: “add”

String idG: id general del subtoken

String idS: id de sesión del subtoken

String idSToken: id de sesión del Token. Si el Token es un sensor y no un objeto, su valor es “–”.

ArrayList<Float> valores: 1 valor

MÉTODOS

String getTokenName() // devuelve el nombre del token

String getManipulacion()  // devuelve la manipulacion

ArrayList<Float> getValores() //devuelve la lista de valores:  1 valor (0 = remove, 1 = add)

String getConstraintName() // devuelve el nombre del constraint

String getSubtokenName() // devuelve el ID general

String getSubtokenIDS() // devuelve el ID de sesión

String getIDSToken() // devuelve el ID de sesión del Token

void info()  // escribe por pantalla la información del TAC