使用 Kinect 获取骨骼的旋转角度(欧拉角,包括 X、Y、Z 轴)。

4
我正在尝试通过Kinect创建.bvh文件。这意味着我需要获取骨架每个骨骼的旋转角度,并且我需要以欧拉角的形式获得这些旋转角度。我已经尝试了许多不同的方法,但是没有一个能给我好的结果。请问有人可以给我一些建议吗?以下是(我认为)代码的主要部分。
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的不清楚的话题。我试过谷歌搜索,但没有成功。

  1. 是否有某种零姿势,例如所有骨头旋转都为零的姿势。 (例如T形)

  2. kinect使用什么样的标准?我是说kinect如何将数据存储到旋转矩阵中?我想知道矩阵是否像

    [X1,Y1,Z1,

    X2,Y2,Z2,

    X3,Y3,Z3]

    或者使用其他顺序?

  3. 关于矩阵...是否可以从kinect给出的矩阵中按标准方法计算欧拉角? 我是指本文中提到的算法之一?

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

1个回答

1

好的,经过更多时间的研究,我想我可能能够回答一些我的问题。如果有人感兴趣...

  1. 我没有找到任何零位姿,但是我使用某种校准创建了自己的零位姿。 我保存了我选择的零位姿的旋转矩阵(让我们称这些为Mz),将这些矩阵转置(MzT),并且我将kinect给我的所有下一个矩阵相乘(让我们称这些为Mr)。 这意味着我以这种方式计算了进一步使用的矩阵:M = MzT x Mr。
  2. 我使用第三个问题中链接中的Rxyz顺序进行转换,一切运作良好,这意味着kinect给出的旋转矩阵可能具有问题中给出的顺序。 这也应该是第三个问题的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接