c# - используя kinect для получения вращения костей(углы Эйлера для оси X, Y, Z)



sdk rotation (1)

Я пытаюсь создать .bvh-файл через kinect.

Это означает, что вам нужно получить поворот каждой кости скелета. Мне нужны повороты в углах Эйлера. Я уже пробовал много разных подходов, но любой из них дал мне хороший результат. Может ли кто-нибудь дать мне совет, что я делаю неправильно?

Вот (я думаю) основная часть моего кода.

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++;
    }
}

Мои углы Эйлера должны храниться в массиве rotationMatrix для дальнейшего использования (сохранение в файл bvh). Здесь возникает моя проблема ... повороты, рассчитанные таким образом, не имеют смысла (я имею в виду, что они не имеют никакого отношения к положению меня впереди kinect), и они кажутся случайными.

Редактировать:

Мне также нужно будет объяснить некоторые неясные темы о kinect. Я попытался это сделать Google, но это не удалось.

  1. Имеет ли kinect скелет что-то вроде нуля? Я имею в виду любую позу, где все вращения кости равны нулю. (например, Т-поза и т. д.)

  2. Какие стандарты используют kinect? Я имею в виду, как kinect хранит данные в матрицах вращения? Я хотел бы знать, соответствует ли матрица

    [X1, Y1, Z1,

    X2, Y2, Z2,

    X3, Y3, Z3]

    или он использует какой-то другой порядок?

  3. О маринах. Можно ли рассчитать углы Эйлера из матрицы, заданной kinect стандартным образом? Я имею в виду некоторые алгоритмы, упомянутые в этой статье?

    http://www.geometrictools.com/Documentation/EulerAngles.pdf


Хорошо, после некоторого времени, потраченного на исследования, я думаю, что смогу ответить на некоторые мои вопросы. Если кому-то интересно ...

  1. я havent нашел любую нольную позу, но я создал свою собственную, используя какую-то калибровку. Я сохранил матрицы вращения для выбранной вами нулевой позы (назовем эти Mz), сделав эти матрицы треугольными (MzT), и я умножил все последующие матрицы kinect (давайте назовем их мистером). Это означает, что я рассчитал матрицы для дальнейшего использования следующим образом: M = MzT x Mr.
  2. Я использовал преобразование из ссылки в 3. вопросе о порядке Rxyz, и все работает хорошо, это означает, что матрицы вращения, заданные kinect, вероятно, имеют порядок, заданный в вопросе. Это также должно отвечать на третий вопрос.




kinect