从四元数中读取特定值

时间:2016-10-26 10:59:04

标签: c# unity3d quaternions

我想从Unity Quaternion https://docs.unity3d.com/ScriptReference/Quaternion.html

中读取以下值

如果x旋转(间距)为180(或0)

如果y旋转(滚动)为180(或0)

获得z旋转(偏航)的性能最高的公式是什么?

我在网上发现这个公式得到z轴,这是最高效的吗? z = qz / sqrt(1-qw * qw) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/

2 个答案:

答案 0 :(得分:1)

您不必使用复杂的公式来读取Quaternion中的值。 Unity已经为你做了!

最简单的方法是阅读 Quaternion Euler Angle ,如下所示:

Vector3 angle = rotation.eulerAngles;

您可以轻松阅读每个轮换angle.x,...

答案 1 :(得分:0)

我发布的公式是从四元数到角度和轴的转换。我需要的是四元数到欧拉角。我意识到我无论如何都不需要x和y角度。

在线找到一些代码并根据我的需要对其进行整形,这只将z角转换为弧度(1.3 ms 10K迭代)

public double GetZAngle(Quaternion q1)
{
    double sqw = q1.w * (double)q1.w;
    double sqx = q1.x * (double)q1.x;
    double sqy = q1.y * (double)q1.y;
    double sqz = q1.z * (double)q1.z;
    double unit = sqx + sqy + sqz + sqw; // If normalized is one, otherwise is correction factor
    double test = (double)q1.x * q1.y + (double)q1.z * q1.w;
    if (test > 0.499 * unit) // Singularity at north pole
        return Math.PI / 2;
    if (test < -0.499 * unit) // Singularity at south pole
        return -Math.PI / 2;
    return Math.Asin(2 * test / unit);
}

没有明确的模式可以区分x和y角度是否为0,但是这里有一个代码片段显示了如何以弧度为单位检索所有这些(2.14 ms 10K迭代(比Unity&#3; 3更快) ms))http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/