使用kinect来获得骨骼的旋转(X,Y,Z轴的欧拉角)

时间:2014-04-26 16:27:32

标签: c# sdk rotation orientation kinect

我正在尝试通过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. kinect骨架是否有零姿势?我指的是所有骨骼旋转为零的任何姿势。 (例如T-pose等)

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

    [X1,Y1,Z1,

    X2,Y2,Z2,

    X3,Y3,Z3]

    还是使用其他订单?

  3. 关于marices ..是否可以通过kinect以标准方式给出的矩阵计算欧拉角?我的意思是本文中提到的一些算法?

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

1 个答案:

答案 0 :(得分:1)

好的,经过一段时间的研究后,我想我可以回答一些问题。如果有人有兴趣......

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