如何正确地将四元数转换为自身
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");
}
}
}
得到的结果意味着四元数 rotation
和 result
不一样。
(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
在 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");
}
}
}
得到的结果意味着四元数 rotation
和 result
不一样。
(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