如何正确地将四元数转换为自身

How to correctly transform Quaternion to itself

在 Unity 项目中,我必须将四元数 class 转换为 Vector3,然后再转换回四元数。

所以我写了代码:

public void method(Quaternion rotation)
{
    Vector3 vector = rotation.eulerAngles;
    process(vector); // doesn't change vector
    Quaternion result = Quaternion.Euler(vector.x, vector.y, vector.z);

    if (rotation != result)
    {
        using (StreamWriter writer = new StreamWriter("Quaternions", true))
        {
            writer.Write(rotation + "\t->\t" + vector + "\t->\t" + result + "\n");
        }
    }
}

得到的结果意味着四元数 rotationresult 不一样。

(0.1, 0.0, 0.0, 1.0)    ->  (13.4, 348.3, 359.3)    ->  (0.1, -0.1, 0.0, 1.0)
(0.1, -0.1, 0.0, 1.0)   ->  (10.3, 0.1, 358.6)  ->  (-0.1, 0.0, 0.0, -1.0)
(0.1, 0.1, 0.0, 1.0)    ->  (13.2, 349.1, 359.3)    ->  (0.1, -0.1, 0.0, 1.0)
(0.1, -0.1, 0.0, 1.0)   ->  (10.3, 0.1, 358.6)  ->  (-0.1, 0.0, 0.0, -1.0)
(0.1, 0.1, 0.0, 1.0)    ->  (13.9, 346.0, 359.6)    ->  (0.1, -0.1, 0.0, 1.0)

我尝试将 Quaternion.Euler(vector.x, vector.y, vector.z) 更改为 Quaternion.Euler(vector),将 if (rotation != result) 更改为 if (rotation.normalized != result.normalized),但没有任何更改。

请教我如何正确地将四元数转换为 Vector3,然后再转换回四元数。

提前致谢。

编辑:精确版本

(0.1208651, -0.1202484, 0.0108935, 0.9852986)   ->  (13.9, 346.3, 359.4)    ->  (0.1205529, -0.1181887, 0.0094058, 0.9856012)
(0.1117781, -0.0784635, 0.0001221, 0.9906307)   ->  (13.9, 346.6, 359.4)    ->  (0.1206529, -0.1155783, 0.0093524, 0.9858990)
(0.1206530, -0.1155784, 0.0093524, 0.9858992)   ->  (13.2, 349.1, 359.3)    ->  (0.1146793, -0.0939169, 0.0047323, 0.9889418)
(0.1102806, -0.0695964, -0.0030001, 0.9914563)  ->  (13.7, 347.4, 359.1)    ->  (0.1191836, -0.1079238, 0.0057138, 0.9869727)
(0.1191836, -0.1079238, 0.0057138, 0.9869727)   ->  (12.9, 350.0, 359.1)    ->  (0.1130020, -0.0854713, 0.0017047, 0.9899103)

更新: 谢谢大家回答!我决定不将四元数转换为 Vector3 并返回。

首先,在 Unity 中调试某些东西的奇怪方式。

现在开始提问。您为什么要尝试将某物转换为其他东西,然后又恢复为自身?根据您的代码,您没有更改创建的 Vector3,那么为什么不直接使用原始的四元数呢?

与四元数本身相比,EulerAngles 所包含的关于四元数旋转的信息实际上并不多,因此在使用 Euler 时,信息很可能会丢失或更改。

这是您可能想查看的 Unity-Documentation 的两个链接。第一个解释了为什么使用 EulerAngles 往往会不一致,而另一个可能有一个解决方案来解决你正在尝试做的事情。

https://docs.unity3d.com/ScriptReference/Quaternion-eulerAngles.html

https://docs.unity3d.com/ScriptReference/Quaternion-operator_multiply.html