使用 kinect 旋转骨骼(X、Y、Z 轴的欧拉角)

Posted

技术标签:

【中文标题】使用 kinect 旋转骨骼(X、Y、Z 轴的欧拉角)【英文标题】:using kinect to get rotation of bones (Euler angles for X, Y, Z axis) 【发布时间】:2014-04-26 16:27:32 【问题描述】:

我正在尝试通过 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 的不清楚的话题。我尝试用谷歌搜索,但没有成功。

    kinect 骨骼是否有类似零姿势的东西?我的意思是所有骨骼旋转为零的任何姿势。 (如T-pose等)

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

    [X1,Y1,Z1,

    X2,Y2,Z2,

    X3,Y3,Z3]

    还是使用其他顺序?

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用 kinect 旋转骨骼(X、Y、Z 轴的欧拉角)的主要内容,如果未能解决你的问题,请参考以下文章

Unity复杂的旋转-欧拉角和四元数

将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转

(转)三维旋转:旋转矩阵,欧拉角,四元数

unity3d把 x的欧拉角赋给y啥作用

RPY roll pitch yaw

unity欧拉角之图文并茂通俗理解