Paso 7: Kinect Scripting
Crear una nueva carpeta dentro de la carpeta de secuencias de comandos llamado KinectScripts. Ahora en esa carpeta crear dos nuevas secuencias de comandos; uno llamado BodyManger y otro había llamado BodyView.
IMAGEN 1
BodyManager
En primer lugar necesitamos BodyManager - esta voluntad objeto Mange la conexión del sensor Kinect y leer todos los datos de cuerpo del Kinect.
Importar la biblioteca de Kinect con:
Entonces necesitamos algunos campos para el encargado de almacenar y los datos y obtener los datos del sensor.
_Sensor de KinectSensor privada;
privado BodyFrameReader _Reader;
privado cuerpo blanco de [] = null;
[] público cuerpo GetData()
{
volver blanco;
}
Bien ahora en el método de inicio que queremos establecer la conexión para el Kinect.
void Start()
{
_Sensor = KinectSensor.GetDefault();
Si (_Sensor! = null)
{
_Reader = _Sensor.BodyFrameSource.OpenReader();
Si (! _Sensor.IsOpen)
{
_Sensor.Open();
}
}
}
Ahora que la conexión está abierta y leer en los datos que necesitamos almacenar en el arreglo del cuerpo. Haremos esta cada fotograma del juego, por lo tanto tenemos que modificar el método Update().
Primero comprobamos si se ha establecido la _Reader y la conexión se ha completado. Si tiene tomaremos el último fotograma, el lector leer en y si no es null, entonces podemos comprobar para ver si los datos están allí.
Ahora tenemos que obtener los datos del cuerpo del Señor. Para hacer esto necesitamos crear una nueva matriz de cuerpo con los datos de la Sensor.BodyFrameSource.BodyCount.
Al final el método debería parecerse a esto:
void Update()
{
Si (_Reader! = null)
{
var marco = _Reader.AcquireLatestFrame();
Si (marco! = null)
{
Si (blanco == null)
{
}
}
}
}
Entonces tenemos que actualizar el flujo de datos desde el lector. Añadiendo el siguiente código para manipular la estructura.
void Update()
{
Si (_Reader! = null)
{
var marco = _Reader.AcquireLatestFrame();
Si (marco! = null)
{
Si (blanco == null)
{
Blanco = Body[_Sensor.BodyFrameSource.BodyCount nuevo];
}
marco. GetAndRefreshBodyData(_Data);
marco. Dispose();
marco = null;
}
}
}
El último método en la clase de Body Manager es OnApplicationQuit(), que dispone el lector y cierra la corriente de Sensor, lo establece en null.
void OnApplicationQuit()
{
Si (_Reader! = null)
{
_Reader.Dispose();
_Reader = null;
}
Si (_Sensor! = null)
{
Si (_Sensor.IsOpen)
{
_Sensor.Close();
}
_Sensor = null;
}
}
Vista del cuerpo
La siguiente secuencia de comandos para escribir es dibujar la estructura esquelética. No necesariamente necesitamos ver el esqueleto del juego, sin embargo, te voy a mostrar cómo mostrar seguimiento esquelético cuerpo. También necesitamos los datos esqueléticos a las manos, cuyo estado dictará órdenes del controlador.
Para esta clase de MonoBehavoir vamos a necesitar, un material para dibujar el hueso en la escena de la unidad. Un gameobject para almacenar el BodyManger, para controlar el flujo del Kinect.
También necesitamos un objeto BodyManager y un diccionario para almacenar los cuerpos siendo rastreados.
A continuación necesitamos todos los huesos de las dos articulaciones que se conectará a un mapa.
BodyView Update()
Ahora en el método Update() de la unidad tenemos que comprobar para ver si el administrador de cuerpo no es null y que tiene datos.
Luego, mientras todavía en el método Update(), que necesitamos obtener la cantidad de cuerpos en la lista de organismos de seguimiento. Luego eliminar cuerpos desconocidos.
Lista de trackedIds = nuevo () de la lista;
foreach (var cuerpo en datos)
{
Si (cuerpo == null)
{
continuar;
}
Si (el cuerpo. IsTracked)
{
trackedIds.Add (cuerpo. TrackingId);
}
}
KnownIds la lista = new List (_Bodies.Keys);
En primer lugar eliminar cuerpos sin seguimiento
foreach (ulong trackingId en knownIds)
{
Si (! trackedIds.Contains(trackingId))
{
Destroy(_Bodies[trackingId]);
_Bodies.Remove(trackingId);
}
}
Ahora que ya tenemos las claves para el seguimiento de los órganos que necesitamos crear un objeto de cuerpo con ese seguimiento clave de ID. Tenemos que escribir dos métodos más. Un método CreateBodyObject() que tendrá un id de ulong y un método RefreashBodyObject() que tendrá un objeto Kinect.Body y un GameObject para el cuerpo. Vamos a utilizar estos métodos después de pasar por los datos y encontrar si se rastrean los cuerpos dentro o no. Si se realiza un seguimiento pero no tiene un TrackingId, necesitamos crear un órgano con TrackingID. Si se rastrean y tiene un TrackingId entonces basta refrescar el cuerpo dibujado.
foreach (var cuerpo en datos)
{
Si (cuerpo == null)
{
continuar;
}
Si (el cuerpo. IsTracked)
{
Si (! _Bodies.ContainsKey (cuerpo. TrackingId))
{
_Bodies [cuerpo. TrackingId] = CreateBodyObject (cuerpo. TrackingId);
}
RefreshBodyObject (cuerpo, _Bodies [cuerpo. TrackingId]);
}
}
}
CreateBodyObject()
La CreateBodyObject toma un ID y devuelve un cuerpo gameobject. Así que primero tenemos que crear un gameobject que almacenará los datos adecuados obtenidos; entonces necesitamos un bucle ir a través de cada articulación para dibujar el cuerpo.
Para cada articulación del cuerpo creamos un cubo y añadir un lineRenderer a ese cubo. El cubo se sorteará en cada empalme mientras se sorteará el procesador de línea para conectar las articulaciones.
RefreashBodyObject()
Ahora a escribir el método ResfreshBodyObject. En este método tenemos que ir a través de cada tipo común posible al igual que en el método CreateBodyObject. Pero este tiempo estamos pasando en el cuerpo actual, así como el correspondiente número de seguimiento para no dibujar los huesos de la persona equivocada.
privado void RefreshBodyObject (Kinect.Body cuerpo, bodyObject GameObject)
{
para (jt Kinect.JointType = Kinect.JointType.SpineBase; jt < = Kinect.JointType.ThumbRight; jt ++)
{
}
}
Dentro de este bucle es necesario obtener los pares de valores clave que hemos hecho antes en el circuito de hueso para cada articulación.
privado void RefreshBodyObject (Kinect.Body cuerpo, bodyObject GameObject)
{
para (jt Kinect.JointType = Kinect.JointType.SpineBase; jt < = Kinect.JointType.ThumbRight; jt ++)
{
Kinect.Joint sourceJoint = cuerpo. Juntas [jt];
¿Kinect.Joint? targetJoint = null;
if(_BoneMap.ContainsKey(JT))
{
targetJoint = cuerpo. Juntas [_BoneMap [jt]];
}
}
}
También tenemos que actualizar la posición de los esqueletos, por lo que es en el lugar exacto en la pantalla. Para ello es necesario escribir un método para obtener la Vetcor3 de la sourceJoint.
La escala de 10 es agrandar el esqueleto, que hará más fácil trabajar con. Ahora tenemos posición para corregir la posición de gameObjects.
Siguiente paso el bucle es obtener el linerenderer de la bodyObject, que era el cubo que creamos para cada articulación. Entonces tenemos que ver si el objetivo común tiene un valor. Si lo hace entonces podemos dibujar una línea de la articulación original en el destino.
LineRenderer lr = jointObj.GetComponent ();
if(targetJoint.HasValue)
{
LR. SetPosition (0, jointObj.localPosition);
LR. SetPosition (1, GetVector3FromJoint(targetJoint.Value));
}
otra cosa
{
LR.Enabled = false;
}
¡ Excelente! Así que ya casi terminamos con el dibujo del esqueleto. Hay un poco más información que será útil que el SDK te da, que es el seguimiento de estado. Hay tres Estados para elegir, orugas, inferidos o NotTracked. Podemos tener el procesador de línea nos muestran el estado de seguimiento cambiando su color. Para ello necesitamos un método que devuelve un color basado en el estado actual.
Ahora añadimos una línea más a la de lazo de la RefreachBodyObject método ya terminados.
Y eso es para dibujar el esqueleto!