我使用了两个例子(也是从这个网站上找的),但结果与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)同样如此。
我只看到一种解决方案 - 将“test”计算为xw-yz。但我不确定这是否正确。
如何修复它?