私は 2 つの例を使用しました (こちらのサイトからも) が、結果は 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) も同様です。
解決策は 1 つだけです。"test" を xw-yz として計算します。しかし、これが正しいかどうかはわかりません。
修正方法は?