首页 文章

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

提问于
浏览
3

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

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

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

我的问题是:

a)Kinect SDK为关节提供绝对和分层矩阵 . 我应该考虑操纵哪一个?

b)四元数给你什么矩阵没有?

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

d)我已经看到如何通过使用如下计算将它们相乘来转换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 回答

  • 2

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

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

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

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

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

相关问题