欧拉角公约转换

时间:2015-05-29 12:01:27

标签: unity3d rotation euler-angles

我目前正在尝试实时显示Unity 3D中Mocap-Suit的MoCap数据。 Suit SDK为每个捕获的关节返回euler角度。我希望我可以通过设置transform.localEulerAngles属性和捕获的欧拉角来获取这些欧拉角并将它们传递到Unity中的相应关节。这很有效,但我有一些Issus就像把脚向右移动一样,Unity中的化身将脚向左移动。

首先我检查了一下,如果捕获SDK使用与Unity相同的euler角度约定:

捕获SDK文档说:

“旋转都是CCW向下看旋转轴(在负方向)每个节点的欧拉角的顺序是z,然后是x,然后是y 所以完整的旋转矩阵是YXZ。“

Unitys doc说:

“x,y和z角度表示围绕z轴旋转z度,围绕x轴旋转x度,围绕y轴旋转y度(按此顺序)。”

所以旋转的顺序似乎是相同的,除了我真的不知道“旋转矩阵是YXZ”是什么意思,并且如果unity也像sdk一样使用逆时针旋转。这可能是问题吗?

我还检查过,如果sdk对其坐标系使用与unity相同的定义:

捕获SDK文档说:

“演员将沿正Z轴站立,最低脚位于Z = 0,面向负Y轴,正X轴指向演员右侧。这是一个右手坐标系。“

由于Unitys坐标系面向轴是Y而X面向右边,我只是在设置transform.localEulerAngles属性时切换了y和z坐标。我知道Unitys的坐标系是左撇子。我是否还必须考虑到这一点?这可能是我问题的一部分吗?

修改

我现在花费了更多的时间来思考这个问题并制作了一些图形以便更好地理解。 SDK使用的坐标系统如下所示:

SDK coordinate system

头像在-y方向看,欧拉角的旋转顺序是z,x,y。

那就是Unity中的坐标系统:

Unity coordinate system

头像朝z方向看。统一的z轴相当于sdk的-y轴。这同样适用于y,z和x,x。因此,我必须使用sdk的z值作为我的y值的单位,sdk的否定y值表示我的z值的单位,而sdk的x值表示我的x值的单位。 / p>

完成此操作后,我认为还有一个问题。 Unity现在应用旋转首先围绕z轴(最初是sdk中的-y轴)旋转,而不是围绕x轴(最初是我的x轴),最后绕y轴旋转(最初是z轴) )。这意味着统一原始sdk轴按以下顺序旋转:-y,x,z。实际上这不是我想要做的,因为我想以z,x,y顺序旋转。

我真的很想知道,如果我的想法是正确的,如果是的话,在Unity中回到正确的旋转顺序会有什么解决方案?

1 个答案:

答案 0 :(得分:1)

好吧,如果我正确地阅读它,似乎它们不一样,一个是a righthanded matrix and the other a lefthanded matrix. 难道你不能以不同方式绘制它们吗?切换z和y值?看看是否有帮助?