2017-10-13 23 views
0

私はカメラコントロールをマウスでプログラミングしています。私は、ユーザーが上下左右に見ることができるようにしたいが、側面に傾けることはできないようにしたい。言い換えれば、YawとPitchを変更してロールを0に制限したい。Quaternionで特定軸周りの回転を防止する

どのようにしてクォータニオンが特定の軸を中心に回転するのを防ぐことができますか?私はx軸の回転やy軸の回転だけを許可するとすべて正常に動作しますが、何らかの理由で両方を同時に許可するとy回転が影響を受け、カメラが横に傾きます。

+1

これは、同じオブジェクトにロールバックさせるヨーとピッチを追加することによって発生する一般的な問題です。私はそれを修正する方法を正確に覚えていませんが、親としてオブジェクトを持たせ、そのオブジェクトをピッチなどのようにしてから、子供オブジェクトまたはその反対のヨーに適用する必要があります。ヨーとピッチを2つの異なるオブジェクトに分けると、それは機能するはずです。 – CNuts

+0

2つのクォータニオンがあり、それらを合成するときのように、結果の四角形を取り、その軸をロール軸に投影し、それを使ってロールコンポーネントを取り除くことができるはずです。しかし、これは、関係する線形代数についての腸の感情に基づく、恥ずかしそうな答えです。 – Omnifarious

答えて

4

説明したように、複数のヨーとピッチの回転を連結すると、ロールの回転が発生する可能性があります。しかし、ヨーとピッチの回転が厳密に乗算の順序で分離されている場合、これは起こらない。例えば。

Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2 

最後にヨー回転が追加された場合にのみ問題が発生します。しかし、これを簡単に防ぐことができます:ヨー回転を追加する場合は、それを左に掛けます。ピッチローテーションを追加する場合は、ピッチローテーションを右に掛けます。私。現在のカメラ回転がRである場合、すべてのヨー回転が同じ軸の周りにあるので

R = additionalYaw * R 

又は

R = R * additionalPitch 

、これらの変換は、実際に通勤します。したがって、どのような順序で表示されるかは関係ありません(同じ軸についての他のすべての回転にも同じです)。もちろん、順序を切り替えることもできます(つまり、最初にピッチを、次にヨー)。あなたが望むコントロールの種類に応じて。

CNutsも代替アプローチについて説明しました。変換階層がある場合は、カメラ変換用に2つのノードを持つことができます。次に、ヨー回転を一方の回転に加え、他方の回転にピッチ回転を加える。これは、上で説明したのと同じ効果をもたらし、異なる軸について回転を効果的に分離する。

+0

私は、四元数変換の非可換の性質について考えてみたいです。優れた答え。 – Omnifarious

関連する問題