从四元数中读取特定值

Read specific values from quaternion

我想从 Unity 四元数中读取以下值 https://docs.unity3d.com/ScriptReference/Quaternion.html

如果x旋转(俯仰)为180(或者0)

如果y旋转(roll)为180(或者0)

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

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

您不必使用复杂的公式即可从四元数中读取值。 Unity 已经为您做到了!

最简单的方法是像这样阅读四元数欧拉角

Vector3 angle = rotation.eulerAngles;

您可以轻松阅读每个旋转 angle.x, ...

我贴的公式是四元数到角度和轴的转换。我需要的是四元数到欧拉角。我意识到我根本不需要 x 和 y 角度。

在网上找到了一些代码并根据我的需要对其进行了调整,这仅将 z 角转换为弧度(1.3 毫秒 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 毫秒 10K 次迭代(比 Unity 的 3 毫秒更快) ) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/