Kinect SDK - 按角度转换角度的旋转

时间:2013-12-06 14:32:26

标签: c# wpf rotation kinect kinematics

我是Kinect开发的新手,我正在尝试构建一个允许旋转Kinect关节的组件。这样做的目的是手动“修复”我捕获的任何骨架数据,捕获后,骨架开始跳转的位置。

我使用螺旋工具包在3D空间中显示Kinect骨架。我可以在任何给定点暂停骨架流,并查看BoneRotations对象中为AbsoluteRotation和HierarchicalRotation保存的矩阵值。

我创建了三个滑块,分别代表X轴,Y轴和Z轴。我已将其最小值/最大值设置为与要操纵的骨骼自然运动相关的值(例如,在Y轴上,肩部不会移动到大约40度以上)。如果我们以肩部(右)关节为例,我希望能够在每个轴上应用旋转,以便我可以在3D空间中更改骨骼的位置。我相信与这种行为有关的术语是正向运动学。

我的问题是:

a)Kinect SDK为联合提供了绝对和分层矩阵。我应该考虑操纵哪一个?

b)四元数给你的矩阵不是什么?

c)如何获取4x4矩阵信息并找到X轴,Y轴和Z轴的角度(以度或弧度表示)?

d)我已经看过如何通过使用这样的计算乘以3x3矩阵来转换3x3矩阵:

    Matrix3X3 matrixx = new Matrix3X3();
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            matrixx.elements[(i * 3) + j] = ((R2.elements[i * 3] * R1.elements[j]) + (R2.elements[(i * 3) + 1] * R1.elements[3 + j])) + (R2.elements[(i * 3) + 2] * R1.elements[6 + j]);
        }
    }
    return matrixx;

如何转换Kinect SDK提供的4x4矩阵?

更具体地说,我可以在每个轴上变换4x4矩阵,以便每个轴都有一个滑块吗?那么如何应用10度的X轴旋转?我已经看到在3x3矩阵上完成了如下旋转:

    public static Matrix3D NewRotateAroundX(double radians)
    {
        var matrix = new Matrix3D();
        matrix._matrix[1, 1] = Math.Cos(radians);
        matrix._matrix[1, 2] = Math.Sin(radians);
        matrix._matrix[2, 1] = -(Math.Sin(radians));
        matrix._matrix[2, 2] = Math.Cos(radians);
        return matrix;
    }
    public static Matrix3D NewRotateAroundY(double radians)
    {
        var matrix = new Matrix3D();
        matrix._matrix[0, 0] = Math.Cos(radians);
        matrix._matrix[0, 2] = -(Math.Sin(radians));
        matrix._matrix[2, 0] = Math.Sin(radians);
        matrix._matrix[2, 2] = Math.Cos(radians);
        return matrix;
    }
    public static Matrix3D NewRotateAroundZ(double radians)
    {
        var matrix = new Matrix3D();
        matrix._matrix[0, 0] = Math.Cos(radians);
        matrix._matrix[0, 1] = Math.Sin(radians);
        matrix._matrix[1, 0] = -(Math.Sin(radians));
        matrix._matrix[1, 1] = Math.Cos(radians);
        return matrix;
    }

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这是多个问题,您应该将它们分解并分别询问每个问题。

a)我没有玩过Kinect,但一般来说绝对是相对于世界空间而且等级是相对于父母。大多数情况下,您希望相对于其父级移动关节。

b)这个问题被问错了。四元数表示轴和围绕该轴的旋转,矩阵可以存储此变换以及许多其他类型,包括缩放,平移,倾斜,投影等。

c)矩阵中前3行的前3个元素为您提供每个轴,即X,Y和Z(同样在世界空间或父空间中,取决于您正在使用哪个轴)。提取那些,选择你所追求的2和谷歌“任意2条3D线之间的角度”(它是它们之间的点积的反余弦)。

d)使用正确的算法取决于许多事情,这是“正确”的方式然后还有很多其他(更快)的方法,如果你可以保证你的矩阵总是会遵循某些维基百科有a page about matrix multiplication或者你可以用代码阅读an old article I wrote almost 20 years ago。后者还应该帮助解释更多关于它们如何工作的信息,并且可能会告诉你如何做其他一些你想要做的事情。