我目前正在尝试在 Unity 3D 中实时显示来自 Mocap-Suit 的 MoCap 数据。 Suit SDK 为每个捕获的关节返回欧拉角。我希望通过使用捕获的欧拉角设置 transform.localEulerAngles 属性,我可以获取这些欧拉角并将它们传递到 Unity 中的适当关节。这工作得很好,但我有一些问题,比如当我向右移动我的脚时,Unity 中的化身将它的脚向左移动。
首先我检查了捕获SDK是否使用与Unity相同的欧拉角约定:
捕获 SDK 文档说:
"旋转都是逆时针方向向下看旋转轴(负方向)每个节点的欧拉角的顺序是z,然后是x,然后是y 所以完整的旋转矩阵是 YXZ。”
Unitys 文档说:
“x、y 和 z 角度表示围绕 z 轴旋转 z 度,围绕 x 轴旋转 x 度,以及围绕 y 轴旋转 y 度(按此顺序)。”
所以旋转的顺序似乎是一样的,除了我真的不知道“旋转矩阵是YXZ”是什么意思,如果unity也像sdk一样使用逆时针旋转。这可能是问题所在吗?
我还检查了 sdk 是否使用与 unity 相同的坐标系定义:
捕获 SDK 文档说:
“ Actor 将沿着正 Z 轴站立,最低脚在 Z=0,面朝负 Y 轴,正 X 轴指向 Actor 的右侧。这是一个右手坐标系”
由于 Unity 的坐标系朝上的轴是 Y,而 X 朝右,我只是在设置 transform.localEulerAngles 属性时切换了 y 和 z 坐标。我知道Unity的坐标系是左手的。我是否也必须考虑到这一点?这可能是我问题的一部分吗?
编辑:
我现在花了更多的时间来思考这个问题,并制作了一些图形来更好地理解。 SDK 使用的坐标系如下所示:
头像正朝-y方向看,欧拉角的旋转顺序为z, x, y。
这就是 Unity 中的坐标系:
头像正朝 z 方向看。 unity中的z轴相当于sdk的-y轴。这同样适用于 y, z 和 x, x。因此,我必须将 sdk 的 z 值用于统一的 y 值,将来自 sdk 的否定 y 值用于统一的 z 值,将来自 sdk 的 x 值用于统一的 x 值。
做完这些之后,我想我又遇到了一个问题。 Unity 现在将通过首先围绕 z 轴(最初是我在 sdk 中的 -y 轴)旋转而不是围绕 x 轴(最初是我的 x 轴)然后最后围绕 y 轴(最初是 z 轴)来应用旋转).这意味着统一原始 sdk 轴按以下顺序旋转:-y、x、z。实际上那不是我想做的,因为我想按 z、x、y 顺序旋转。
我真的很想知道,如果我的想法是正确的,如果是的话,在 Unity 中恢复正确旋转顺序的解决方案是什么?
最佳答案
好吧,如果我没看错的话,它们似乎不一样,一个是 a righthanded matrix and the other a lefthanded matrix. 你不能用不同的方式绘制它们吗?切换 z 和 y 值?看看有没有帮助?
关于unity3d - 欧拉角约定变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30529093/