使用 kinect 旋转骨骼(X、Y、Z 轴的欧拉角)
Posted
技术标签:
【中文标题】使用 kinect 旋转骨骼(X、Y、Z 轴的欧拉角)【英文标题】:using kinect to get rotation of bones (Euler angles for X, Y, Z axis) 【发布时间】:2014-04-26 16:27:32 【问题描述】:我正在尝试通过 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 的不清楚的话题。我尝试用谷歌搜索,但没有成功。
kinect 骨骼是否有类似零姿势的东西?我的意思是所有骨骼旋转为零的任何姿势。 (如T-pose等)
kinect 使用什么样的标准?我的意思是 kinect 如何将数据存储到旋转矩阵中?我想知道矩阵是否像
[X1,Y1,Z1,
X2,Y2,Z2,
X3,Y3,Z3]
还是使用其他顺序?
关于 marices.. 是否可以从 kinect 以标准方式给出的矩阵计算欧拉角?我是指本文中提到的一些算法?
http://www.geometrictools.com/Documentation/EulerAngles.pdf
【问题讨论】:
【参考方案1】:好的,在花更多时间研究之后,我想我可能能够回答我的一些问题。如果有人有兴趣...
-
我还没有找到任何零姿势,但我使用某种校准创建了自己的姿势。我为我选择的零姿势(我们称之为 Mz)保存了旋转矩阵,使这些矩阵转置(MzT),然后我将 kinect 给我的所有下一个矩阵相乘(我们称之为 Mr)。
这意味着我以这种方式计算了进一步使用的矩阵:M = MzT x Mr.
我使用了 3. 问题中 Rxyz 顺序的转换,并且一切正常,这意味着 kinect 给出的旋转矩阵可能具有问题中给出的顺序。这也应该是第三个问题的答案。
【讨论】:
以上是关于使用 kinect 旋转骨骼(X、Y、Z 轴的欧拉角)的主要内容,如果未能解决你的问题,请参考以下文章