[XNA] Detección de movimientos con una webcam (II de II)

En el artículo anterior describí unos sensores en determinadas zonas de la textura captada por nuestra webcam. Mediante estos sensores se pueden hacer distintas cosas, así a voz de pronto se me ocurre: pintar en pantalla con los dedos (sin tocarla obviamente xD), tocar un piano…, y otra que puede tener una utilidad más inmediata en videojuegos… mover o esquivar objetos. Lo que vamos a hacer pues será eso. Dado un modelo 3D como el de la fotografía, trataremos de moverlo por la pantalla.

Para ver como funcionan los sensores, habilitaremos dos viewports que dividirán la pantalla en dos zonas. La superior mostrará la textura tomada por la cámara y los sensores (estado y posición), y la parte inferior mostrará el modelo renderizado. La gracia del asunto está en que usaremos dos sensores, y la nave rotará hacia a la izquierda o derecha dependiendo de qué sensor activemos.

La posible complegidad algorítmica está resuelta en el artículo anterior… mover la nave resultará ahora trivial:

protected override void Update(GameTime gameTime)
{
   
if (Keyboard.GetState().IsKeyDown(Keys.Escape))
      
this.Exit();

    sensorDerecha.Update(gameTime, this.capture.colorData, this.capture.CurrentFrame);
    sensorIzquierda.Update(gameTime,
this.capture.colorData, this.capture.CurrentFrame);

    float direccion = 0;

    if(sensorIzquierda.hayCambio)
         direccion -= 0.01f;
   
if(sensorDerecha.hayCambio)
         direccion += 0.01f;

    mundo *= Matrix.CreateRotationZ(direccion);

    base.Update(gameTime);
}

Se ve rápidamente que llamamos a la lógica de cada sensor, y a continuación utilizamos la información de estos sensores para rotar la nave hacia una dirección u otra, respecto el eje Z.

Otra pequeña particularidad que puede tener este código es que utiliza dos viewports en lugar de uno. Esto permite dividir la pantalla en N zonas de renderizado (en este caso dos). Esto se acostumbra a utilizar para los videojuegos multijugador, en que cada player tiene su trozo de pantalla.

Este es el resultado del experimento (el código se encuentra adjunto a este artículo):

[View:http://www.youtube.com/watch?v=l2GauTpw2C8:550:0]

 

Editado: He subido una versión actualizada del código, la nave giraba al revés!! (izquierda al levantar la mano derecha y derecha al levantar la mano izquierda), si es que no se puede trabajar a esas horas de la noche… 🙂

Un comentario en “[XNA] Detección de movimientos con una webcam (II de II)”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *