c# - zyx - usando kinect para obtener la rotación de los huesos(ángulos de Euler para X, Y, eje Z)
transformacion de rotacion (1)
De acuerdo, después de pasar más tiempo investigando, creo que podría responder algunas de mis preguntas. Si alguien está interesado ...
- No he encontrado ninguna pose cero, pero creé la mía usando algún tipo de calibración. Guardé matrices de rotación para mi posición cero elegida (llamemos a estas Mz), hice estas matrices (MzT) y multipliqué todas las matrices siguientes que me dio kinect (llamémoslas Mr). Significa que calculé las matrices para un uso posterior de esta manera: M = MzT x Sr.
- Usé la conversión del enlace en 3. pregunta para el orden de Rxyz y todo funcionó bien, significa que las matrices de rotación dadas por kinect probablemente tienen el orden dado en la pregunta. Esto debería ser la respuesta a la tercera pregunta también.
Estoy tratando de crear un archivo .bvh a través de kinect.
Significa que es necesario obtener rotaciones de cada hueso de un esqueleto. Necesito las rotaciones en ángulos de Euler. Ya probé muchos enfoques diferentes, pero ninguno de ellos me dio buenos resultados. ¿Alguien podría darme algún consejo qué estoy haciendo mal?
Aquí está (creo) la parte principal de mi código.
foreach (Skeleton skeleton in newSkeleton)
{
if (skeleton.TrackingState != SkeletonTrackingState.Tracked)
continue;
int j = 0;
foreach (BoneOrientation orientation in skeleton.BoneOrientations)
{
Matrix4 matrix = orientation.HierarchicalRotation.Matrix;
double y = Math.Asin(matrix.M13);
double x = Math.Atan2(-matrix.M23, matrix.M33);
double z = Math.Atan2(-matrix.M12, matrix.M11);
rotationMatrix[j, 0] = x * 180 / Math.PI;
rotationMatrix[j, 1] = y * 180 / Math.PI;
rotationMatrix[j, 2] = z * 180 / Math.PI;
j++;
}
}
Mis ángulos euler deben almacenarse en la matriz rotationMatrix
para su uso posterior (guardarlos en un archivo bvh). Aquí viene mi problema ... las rotaciones calculadas de esta manera no tienen sentido (quiero decir que no tienen nada que ver con mi posición antes que kinect) y parecen ser aleatorias.
Editar:
También necesitaría explicar algunos temas poco claros sobre kinect. Traté de Google, pero no tuvo éxito.
¿El esqueleto de kinect tiene algo así como la pose de cero? Me refiero a cualquier pose donde todas las rotaciones de hueso sean cero. (por ejemplo, T-pose, etc.)
¿Qué tipo de estándares usa kinect? Quiero decir, ¿cómo almacena kinect los datos en matrices de rotación? Me gustaría saber si la matriz es como
[X1, Y1, Z1,
X2, Y2, Z2,
X3, Y3, Z3]
o usa alguna otra orden?
Acerca de los marices ... ¿Es posible calcular ángulos de Euler a partir de la matriz dada por kinect de manera estándar? Me refiero a algunos de los algoritmos mencionados en este documento?