从四元数中读取特定的值

本文关键字:读取 四元数 | 更新日期: 2023-09-27 18:15:04

我想从Unity四元数中读取以下值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/

从四元数中读取特定的值

您不必使用复杂的公式来读取四元数的值。Unity已经帮你做到了!

最简单的方法是像这样读取四元数欧拉角:
Vector3 angle = rotation.eulerAngles;

你可以很容易地读取每个旋转angle.x,…

我发布的公式是从四元数到角度和轴的转换。我需要的是欧拉角的四元数。我意识到我不需要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 ms更快))http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/