我创建了三个滑块,分别代表x轴、y轴和z轴。我将它们的最小/最大值设置为与骨骼的自然运动相关的值(例如,在Yaxis上,肩膀的运动不超过大约40度)。如果我们以肩(右)关节为例,我希望能够在每个轴上应用旋转,这样我就可以改变骨骼在三维空间中的位置。我相信与这种动作相关的术语是正向运动学。
我的问题是:
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;
更具体地说,我是否可以在每个轴上转换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;
}
提前感谢帮助!