【问题标题】:Is there an algorithm to convert Euler angles to different rotation order?是否有将欧拉角转换为不同旋转顺序的算法?
【发布时间】:2022-04-10 01:06:57
【问题描述】:

Unity 提供了一种获取欧拉角和四元数的简单方法。但是在其他 3D 软件(例如 3dsmax)中角度不正确,因为 Unity 中的旋转顺序是 Y-X-Z 而其他则不是。有没有办法在不同的旋转顺序之间转换欧拉角? 更多细节: 实际上,我需要将 Unity 中的模型导出为 .fbx 文件。通过使用 FBX SDK,我通过调用 GlobalSetting.SetAxisSystem() 解决了 Unity 和 3dsmax 之间的坐标差异。如下图所示: rotation provided in Unity

如果我直接在fbx文件中设置旋转数据,并将fbx模型导入Unity:

Rotation showed imported

我已检查坐标是否正确。我认为至关重要的是欧拉顺序,在 Unity 中是 y-x-z,但 fbx 不是。所以Unity在导入的时候会做一些额外的旋转操作。

【问题讨论】:

  • 根据docs的旋转顺序是z,x,y
  • 旋转矩阵的顺序是z-x-y,所以旋转顺序应该是y-x-z。两者都会导致这个问题。
  • 一种粗略的方法是计算每个角度的矩阵,重新排列这些矩阵,然后重新转换为欧拉角。
  • 如何使用另一个欧拉角(y-x-z 顺序,Unity 提供)来计算矩阵(x-y-z 顺序)?@meowgoesthedog 这很粗略但并不简单。请注意,获得的角度是有序的。
  • 矩阵本身(给定here)很简单。从矩阵转换回欧拉角的公式也很容易获得(例如here)。 Google 是您的朋友。

标签: unity3d 3d rotation fbx


【解决方案1】:

Three.js 是唯一一个开源库(我能找到),可以解决不同轮换顺序的转换问题。例如,假设您有一个旋转顺序为 XZY 的第三方程序(例如,您的 3D 建模程序),并且它将旋转导出为以度为单位的欧拉角。转换为 Unity 旋转是

public static Quaternion XZYToUnity( Vector3 r ) {

  return  

    Quaternion.AngleAxis( r.x, Vector3.right ) *
    Quaternion.AngleAxis( r.z, Vector3.forward ) *
    Quaternion.AngleAxis( r.y, Vector3.up );
}

请注意,在 Unity 中,四元数从左到右应用,与(通常)旋转矩阵相反。需要明确的是,上面的代码产生一个旋转,当您将其分配给Transform.localRotation 时,首先围绕局部 X 轴旋转变换,然后是局部 Z 轴,然后是局部 Y 轴,按此顺序。见this thread about quaternion multiplication order

现在,对于另一个方向,您可以在 Three.js Euler source code 中找到适合您的轮换顺序的正确大小写。将我们的特殊情况“XZY”转换为 C#:

public static Vector3 UnityToXZY( Quaternion q ) {

  var m = Matrix4x4.Rotate( q );   
  float m11 = m[ 0, 0 ], m12 = m[ 0, 1 ], m13 = m[ 0, 2 ];
  float m21 = m[ 1, 0 ], m22 = m[ 1, 1 ], m23 = m[ 1, 2 ];
  float m31 = m[ 2, 0 ], m32 = m[ 2, 1 ], m33 = m[ 2, 2 ];

  float x, y, z;
  z = Mathf.Asin( - Mathf.Clamp( m12, -1, 1 ));

  if( Mathf.Abs( m12 ) < 0.9999999f ) {

    x = Mathf.Atan2( m32, m22 );
    y = Mathf.Atan2( m13, m11 );
  }
  else {

    x = Mathf.Atan2( - m23, m33 );
    y = 0;
  }

   return new Vector3( x, y, z ) * Mathf.Rad2Deg;
}

如果您将Transform.localRotation 输入此方法,它会返回我们在第一种方法中放入的 XZY 欧拉角(忽略欧拉角的数值误差和代表性非唯一性)。形式上,从 Unity 四元数到 XZY 并返回保证在空间中保持方向

【讨论】:

    猜你喜欢
    • 2017-02-08
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多