Iは、ポインティングデバイスながらユーザとして角度を記録するアプリケーションがオブジェクトの中心に(好ましくは)、オブジェクトの周りに歩いている持っています。 ユーザーのコマンドで角度がリセットされるため、基準姿勢がリセットされます。オイラーの角度使用姿勢変化 - 角度と軸の問題 - クォータニオン数学
はジンバルロックを生成しますので、私は現在、このように四元数を使って角度を計算しています:
double angleFromLastPosition = acos(fromLastPositionAttitude.quaternion.w) * 2.0f;
これは良い精度を放つと、デバイスのピッチとヨーが変わらない場合、それは完璧に動作します。言い換えれば、角度が360度を示すように、私は円の始まりと同じ場所で終わる。
問題1:デバイスのヨーとピッチの変化がわずかに(ユーザがオブジェクトの中心に直接指していない)場合、そうangleFromLastPositionを行います。 私のアングル式は3D空間内の2つのデバイス姿勢の間の角度を示しているだけなので、この部分を理解しています。
シナリオ:
- 私は、たとえば、でデバイスの45度変更ピッチを停止回転姿勢の開始をマークし、中央に
- を指しながら、オブジェクトの周りに円形に移動を開始それを上または下に向けることによって。それに応じて角度も変化する。
- 私が見たいと思うのは、ピッチやヨーが変わっても、角度は45度のままです。
質問1は、クォータニオンを使用してデバイスのロールだけを計算し、他の2つの軸の変更を無視するにはどうすればよいですか?
問題2:私がちょっと回転して、デバイスを完全に凍らせても(まったく揺れることがないように)、angleFromLastPositionは約10-20秒ごとに1度の割合でドリフトします。線形であること。言い換えれば、最初は速くドリフトし、その後はかなり減速します。時には私はまったくドリフトがありません - デバイスが静止している場合、角度は堅実です。そして、これは私が何が起こっているのか理解していなくなった。
質問2、ここでは何が起こっているのですか。どのようにドリフトを処理できますか?
私はかなりの数の記事やチュートリアルを経て、および四元の数学は、現時点では私を超えている、誰かが先、リンク、または数行のコードを支援することができます願っています。
は[漂流ヨー]と関連している可能性があります(http://stackoverflow.com/questions/13613239/drifting-yaw-angle-after-moving-fast?rq=1)?はいの場合、質問1の式を見つけることで両方の問題が処理されます:) –
CMAttitudeを使用している場合は、fromLastPositionAttitude.rollを使用してデバイスのロールを得ることができない特別な理由はありますか?私はこれがクォータニオンプロパティを使用していないことを感謝しますが、そこに使用される! –
はい、それから始まります - オイラーアングルを使用すると、ジンバルロックが生じ、自由度が失われます。デバイスがZ軸と位置合わせされていない場合、360度回転しません。少なくともこれは効果の私の理解です。 –