我正在尝试通过Kinect创建.bvh文件。这意味着我需要获取骨架每个骨骼的旋转角度,并且我需要以欧拉角的形式获得这些旋转角度。我已经尝试了许多不同的方法,但是没有一个能给我好的结果。请问有人可以给我一些建议吗?以下是(我认为)代码的主要部分。
foreach (Skeleton skeleton in newSkeleton)
{
if (skeleton.TrackingState != SkeletonTrackingState.Tracked)
continue;
int j = 0;
foreach (BoneOrientation orientation in skeleton.BoneOrientations)
{
Matrix4 matrix = orientation.HierarchicalRotation.Matrix;
double y = Math.Asin(matrix.M13);
double x = Math.Atan2(-matrix.M23, matrix.M33);
double z = Math.Atan2(-matrix.M12, matrix.M11);
rotationMatrix[j, 0] = x * 180 / Math.PI;
rotationMatrix[j, 1] = y * 180 / Math.PI;
rotationMatrix[j, 2] = z * 180 / Math.PI;
j++;
}
}
我的欧拉角应该存储在rotationMatrix
数组中,以便进一步使用(保存到bvh文件中)。但是这里出现了问题...通过这种方式计算的旋转角似乎与我站在kinect前的位置没有关系,它们似乎是随机的。
编辑:
我也需要解释一些关于kinect的不清楚的话题。我试过谷歌搜索,但没有成功。
是否有某种零姿势,例如所有骨头旋转都为零的姿势。 (例如T形)
kinect使用什么样的标准?我是说kinect如何将数据存储到旋转矩阵中?我想知道矩阵是否像
[X1,Y1,Z1,
X2,Y2,Z2,
X3,Y3,Z3]
或者使用其他顺序?
关于矩阵...是否可以从kinect给出的矩阵中按标准方法计算欧拉角? 我是指本文中提到的算法之一?