c# - Kinect SDK - 按度数变换角度的旋转

标签 c# wpf rotation kinect kinematics

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

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

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

我的问题是:

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 矩阵,以便每个轴都有一个 slider ?那么如何应用 X 轴旋转 10 度呢?我已经看到在 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;
    }

提前感谢您的帮助!

最佳答案

这是多个问题,您可能应该将它们分解并分别提问。

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

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

c) 矩阵前 3 行的前 3 个元素为您提供每个轴,即 X、Y 和 Z(同样在世界空间或父空间中,具体取决于您使用的是哪个)。提取它们,选择您想要的 2,然后在 Google 上搜索“任意 2 条 3D 线之间的角度”(它是它们之间点积的反余弦值)。

d) 要使用的正确算法取决于很多因素,有“正确”的方法,还有很多其他(更快)的方法也可以工作,如果你能保证你的矩阵总是遵循某些仿射等属性。维基百科有a page about matrix multiplication或者你可以阅读 an old article I wrote almost 20 years ago与代码。后者还应该有助于更多地解释它们是如何工作的,并且可能会向您展示如何做您希望做的其他一些事情。

关于c# - Kinect SDK - 按度数变换角度的旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20426415/

相关文章:

Android旋转imageview,我无法在onAnimationEnd()中设置imageview的最终位置

rotation - 在 Three.js 中旋转平面的边缘

c# - ASP.NET C# 将方法移动到类文件并从代码隐藏调用它

c# - 从列表中实例化的类中获取字段列表,并比较它们

wpf - 使用 Visual Studio 2017 在 WPF 应用程序中创建功能区

c# - backgroundworker+wpf -> 卡住窗口

c# - 有谁知道计算正态分布中的反 erf() 函数的 .NET 库?

c# - 同时多次调用api的最佳方法是什么?

wpf - 从 WinForms BackgroundWorker 创建 WPF 窗口

ios - Swift SpriteKit - SKAction 中的 zRotation 跟随路径