1

私は iOS 拡張現実アプリケーションに取り組んでいます。マーカーベースではなく、ロケーションベースです。

GPS、コンパス、加速度計を使用して、緯度、経度、高度、およびヨー、ピッチ、ロールの 3 つのオイラー角を取得します。NSLog() を使用して、これらの 6 つの変数に有効なデータが含まれていることを知っています。

私のアプリケーションは、カメラ ビュー上にいくつかの 3D オブジェクトを表示します。ロール角以外のすべてを使用する限り、問題なく動作します。

その 3 番目の角度を追加すると、opengl ワールドに適用される回転がうまくいきません。メインの OpenGL draw メソッドでそのようにします

glRotatef(pitch, 1, 0, 0);
glRotatef(yaw, 0, 1, 0);
//glRotatef(roll, 0, 0, 1);

このアプローチには何か問題があると思いますが、私は確かに専門家ではありません。たぶん、3 つの異なる回転行列ではなく、ある種の独自の回転行列を作成する必要がありますか?

そう簡単には出来ないのではないでしょうか?結局のところ、ほとんどのデスクトップ ビデオ ゲーム、FPS などでは、ユーザーがマウスを使用してヨーとピッチを変更できるようにするだけなので、角度は 3 ではなく 2 つだけです。現実はあらゆる角度で動くことができます。

しかし、繰り返しになりますが、私がオンラインで見たすべての AR チュートリアルは、「ロール」を適切に処理できませんでした。携帯電話を「ローリング」すると、ロール補正戦略を使用して、AR を完全に台無しにするか、まったく何もしません。

私の質問は、電話センサーを使用して3つのオイラー角があると仮定すると、それらを3d openglビューにどのように適用すればよいですか?

4

1 に答える 1

1

おそらくジンバルロックについて話していると思います。

問題の本質は、オイラーで回転する場合、常に順序があるということです。たとえば、x を中心に回転し、次に y を中心に、次に z を中心に回転します。しかし、1 つの軸は常にあいまいになる可能性があります。これは、前のものが別の軸に移動する可能性があるためです。

回転が x を中心に 0 度、y を中心に 90 度、z を中心に 20 度であるとします。したがって、x 回転を実行しても何も変化しません。y 回転を行うと、すべてが 90 度移動します。しかし、今は x 軸があった場所に z 軸を移動しました。したがって、z 回転は x の周りに表示されます。

ほとんどの人の本能が何と言おうと、問題を回避する方法はありません。ひざまずく反応は、常にローカル軸ではなくグローバル軸を中心に回転することです。これでは問題は解決しません。順序が逆になるだけです。z 回転は、y 回転 (既に発生している) を x 回転にすることができます。

角度の測定から分離された回転の独自の記述を作成することを目指す必要があるのは正しいです。

拡張現実の場合、実際にはそれほど難しいことではありません。

加速度計は、どちらが下にあるかを教えてくれます。コンパスは北の方角を教えてくれます。ただし、この 2 つは直交していない可能性があります。コンパスの読み取り値は、赤道上の床に対して正確に直角であることから、極の加速度計と正確に平行であることまでさまざまです。

そう:

  1. 加速度計のベクトルを下として受け入れるだけです。
  2. ダウンとコンパス ベクトルの外積を取得して、サイド ベクトルを取得します。これは、経度の線に沿っている必要があります。
  3. 次に、サイド ベクトルとダウン ベクトルの外積を取得して、適切に垂直な北ベクトルを取得します。

内積を同様に使用して、重力の方向にあるコンパス ベクトルの部分を削除し、そこから外積することもできます。

すべてを正規化する必要があります。

これで 3 つの基底ベクトルが得られるので、それらを直接行列に入れます。これ以上の作業は必要ありません。

于 2013-12-26T22:53:14.983 に答える