我对Kinect开发相对较新,正在尝试构建一个组件,允许旋转Kinect关节。其目的是在捕获后手动“修复”任何骨架数据,当骨架开始跳动时。
我使用helix toolkit在3D空间中显示Kinect骨架。可以在任何给定点暂停骨架流并查看BoneRotations对象中保存的绝对旋转和分层旋转的矩阵值。
我创建了三个滑块,代表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;
}
提前感谢您的帮助!