unity3d - 欧拉角约定变换

标签 unity3d rotation euler-angles

我目前正在尝试在 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 使用的坐标系如下所示:

SDK coordinate system

头像正朝-y方向看,欧拉角的旋转顺序为z, x, y。

这就是 Unity 中的坐标系:

Unity coordinate system

头像正朝 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/

相关文章:

c++ - 从欧拉角到四元数

rotation - 将旋转分解为围绕任意正交轴的旋转的更快方法

c# - 为什么我不断收到错误消息,指出 StandardPurchasingModule' 在当前上下文中不存在?

javascript - Unity - 与客户端 Javascript 和 ajax 通信。如何将数据从统一传回网页?

c# - 使用 Destroy() 函数时出现缺少引用异常

arrays - 将二维数组旋转 90 度

java - 图形(2D)旋转: Rotate x Axis

android - Unity - 陀螺仪 - 仅绕一个轴旋转

c - 如何在给定俯仰、滚动和偏航的情况下渲染 3D 轴?

c# - Euler <=> Quaternion 之间的转换,就像在 Unity3d 引擎中一样