【发布时间】:2012-08-23 09:26:10
【问题描述】:
我使用了两个示例(也来自这个站点),但结果与 Unity 中的结果不同。
Quaternion.Euler 和 .eulerAngles 是 Unity 函数。 FromQ 不执行奇点检查,FromQ2 执行。
结果:
eulers = (100,55,-11):
Quaternion.Euler(eulers) == (0.6, 0.4, -0.4, 0.5)
ToQ(eulers)); == (0.5, -0.4, 0.2, 0.7) // 0.5, -0.4 right but in wrong order
FromQ(ToQ(eulers)) == (55.0, 100.0, -11.0)
FromQ2(ToQ(eulers)) == (-55.5, -6.3, 71.0) // something right
Quaternion.Euler(eulers).eulerAngles == (80.0, 235.0, 169.0)
FromQ2(Quaternion.Euler(eulers)) == (65.8, 1.9, 99.8)
ToQ(eulers).eulerAngles == (70.0, 286.9, 341.4)
FromQ(Quaternion.Euler(eulers)) == (-65.8, 76.0, 4.6)
It must be:
FromQ() = FromQ2() = .eulerAngles,
ToQ() = Quaternion.Euler()
代码在这里:http://pastebin.ru/eAlTHdYf
谁能更正这段代码?我需要返回与 Unity 函数返回的值相同的值的代码。
更新
这里是固定代码:http://pastebin.com/riRLRvch。 两个函数(FromQ 和 ToQ)都运行良好。但我有一个奇点的问题。它无法正确检测到奇点。
For example (90, 0, 50) in quaternion is (0.6, -0.3, 0.3, 0.6).
test = x * y + z * w = 0 (must be close to 0.5 or -0.5)
FromQ 不能计算出正确的结果,所以这里有奇点。 (90, 50, 0) - (0.6, 0.3, -0.3, 0.6) 也是如此。
我只看到一种解决方案 - 将“测试”计算为 xw-yz。但我不确定这是否正确。
如何解决?
【问题讨论】:
-
在非统一方法中应用欧拉旋转的顺序是什么?来自 Unity 文档:“返回围绕 z 轴旋转 z 度、围绕 x 轴旋转 x 度和围绕 y 轴旋转 y 度(按此顺序)的旋转。”如果您的比较方法没有应用相同的 ZXY 顺序,那么您的 quats 可能不匹配。
-
可能是。我真的不明白我的任务的数学解决方案,所以我无法确定我正在使用哪个阶函数来计算角度。代码没有给我答案。
-
我是程序员,数学不好,自己也找不到解决办法。
标签: c# math unity3d quaternions euler-angles