Me gustaría almacenar los datos de captura de movimiento de Kinect 2 como un archivo BVH. Encontré un código que lo hace para Kinect 1 que se puede encontrar aquí . Revisé el código y encontré varias cosas que no pude entender. Por ejemplo, en el código mencionado he tratado de comprender qué es exactamente el skel
objeto Skeleton , que se encuentra en varios lugares del código. Si no, ¿hay alguna aplicación conocida disponible para lograr el objetivo?
EDITAR: Traté de cambiar Skeleton skel a Body skel, que creo que es el objeto correspondiente para kinect SDK 2.0. Sin embargo, tengo un error cuando intento obtener la posición del cuerpo:
tempMotionVektor[0] = -Math.Round( skel.Position.X * 100,2);
tempMotionVektor[1] = Math.Round( skel.Position.Y * 100,2) + 120;
tempMotionVektor[2] = 300 - Math.Round( skel.Position.Z * 100,2);
Recibí errores al llamar a la función Posición para el skel del cuerpo. ¿Cómo puedo recuperar la X, Y, Z del esqueleto en SDK 2.0? Traté de cambiar las tres líneas anteriores a:
tempMotionVektor[0] = -Math.Round(skel.Joints[0].Position.X * 100, 2);
tempMotionVektor[1] = Math.Round(skel.Joints[0].Position.Y * 100, 2) + 120;
tempMotionVektor[2] = 300 - Math.Round(skel.Joints[0].Position.Z * 100, 2);
EDITAR: Básicamente logré almacenar el archivo bvh después de combinar bodyBasicsWPF y kinect2bvh. Sin embargo, parece que el esqueleto que estoy almacenando no es eficiente. Hay movimientos extraños en los codos. Estoy tratando de entender si tengo que cambiar algo en el archivo kinectSkeletonBVH.cp . Más específicamente, cuáles son los cambios en la orientación del eje de la articulación para la versión kinect 2. ¿Cómo puedo cambiar la siguiente línea skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion;
? Intenté cambiar esa línea con skel.JointOrientations[JointType.ShoulderCenter].Orientation
. Estoy en lo cierto? Estoy usando el siguiente código para agregar la unión a los objetos BVHBone:
BVHBone hipCenter = new BVHBone(null, JointType.SpineBase.ToString(), 6, TransAxis.None, true);
BVHBone hipCenter2 = new BVHBone(hipCenter, "HipCenter2", 3, TransAxis.Y, false);
BVHBone spine = new BVHBone(hipCenter2, JointType.SpineMid.ToString(), 3, TransAxis.Y, true);
BVHBone shoulderCenter = new BVHBone(spine, JointType.SpineShoulder.ToString(), 3, TransAxis.Y, true);
BVHBone collarLeft = new BVHBone(shoulderCenter, "CollarLeft", 3, TransAxis.X, false);
BVHBone shoulderLeft = new BVHBone(collarLeft, JointType.ShoulderLeft.ToString(), 3, TransAxis.X, true);
BVHBone elbowLeft = new BVHBone(shoulderLeft, JointType.ElbowLeft.ToString(), 3, TransAxis.X, true);
BVHBone wristLeft = new BVHBone(elbowLeft, JointType.WristLeft.ToString(), 3, TransAxis.X, true);
BVHBone handLeft = new BVHBone(wristLeft, JointType.HandLeft.ToString(), 0, TransAxis.X, true);
BVHBone neck = new BVHBone(shoulderCenter, "Neck", 3, TransAxis.Y, false);
BVHBone head = new BVHBone(neck, JointType.Head.ToString(), 3, TransAxis.Y, true);
BVHBone headtop = new BVHBone(head, "Headtop", 0, TransAxis.None, false);
No puedo entender dónde the axis for every Joint
se calcula el código interno .