Я достаточно новичок в разработке Kinect и пытаюсь создать компонент, который позволяет вращать суставы Kinect. Цель этого состоит в том, чтобы вручную «исправить» любые данные скелета, которые я захватил, после захвата, когда скелет начинает прыгать.
Я показываю скелет Kinect в трехмерном пространстве с помощью набора инструментов helix. Я могу приостановить поток скелета в любой заданной точке и увидеть значения матрицы, содержащиеся в объекте BoneRotations для AbsoluteRotation и HierarchicalRotation.
Я создал три ползунка, которые представляют ось X, ось Y и ось Z. Я установил их минимальные / максимальные значения на то, что имеет отношение к естественному движению кости, которым нужно управлять (например, на Yaxis плечо не перемещается выше примерно 40 градусов). Если мы возьмем плечевой (правый) сустав в качестве примера, я хочу иметь возможность применять вращения по каждой оси, чтобы я мог изменять положение кости в трехмерном пространстве. Я считаю, что терминология, относящаяся к этому виду действий, - это прямая кинематика.
Мои вопросы:
а) Kinect SDK предоставляет абсолютную и иерархическую матрицу для сустава. На что я должен смотреть, чтобы манипулировать?
б) Что дает вам Quaternion, чего нет в матрице?
c) Как мне взять информацию о матрице 4x4 и найти угол (в градусах или радианах) для оси X, оси Y и оси Z?
г) Я видел, как преобразовывать матрицы 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, предоставленную Kinect SDK?
Более конкретно, могу ли я преобразовать матрицу 4x4 на каждой оси, чтобы у меня был ползунок для каждой оси? Итак, как мне применить поворот оси 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;
}
Заранее благодарим за помощь!