1

AndroidのSensorManager.getOrientation()から取得するヨーピッチとロールは、すべて電話のY軸用です。つまり、ヨーとピッチはY軸がどこを指しているかを示し、ロールはY軸を中心にしています。(そして私の画面の向きはlandsapeに固定されているので、Y軸は変わりません)。しかし、私が欲しいのは、負のZ軸(電話指す)のヨーピッチとロールです。電話の画面が飛行機のコックピットの横向きの窓である場合、ヨーピッチとロールはどうなりますか?

4

2 に答える 2

2

あなたの言っていることが理解できれば、+y 軸がデフォルトの「前」ベクトルであり、+z 軸がデフォルトの「上」ベクトルであるかのように、現在のヨー ピッチとロールが返されていることがわかります。-z 軸をデフォルトの「前」ベクトルとして、+x ベクトルをデフォルトの「上」ベクトルとして、ヨー、ピッチ、およびロールが計算されるように、座標変換を実行したいと考えています。

まず、現在の構成でヨー、ピッチ、ロールから現在のフロント ベクトルとアップ ベクトルを計算する必要があります。これは、3D 回転行列を使用して行うことができます: http://en.wikipedia.org/wiki/Rotation_matrix#Rotations_in_three_dimensions

ヨー角を使用して z を中心に回転し、ピッチを x を中心とした回転として、ロールを y を中心とした回転として使用します。これらの行列を乗算し、フロント ベクトル (0, 1, 0) とアップ ベクトル (0, 0, 1) を結果で乗算して、新しいフロント ベクトルとアップ ベクトルを取得します。

次に、新しいヨー角、ピッチ角、ロール角を計算する必要があります。ヨーは、yz 平面に投影されたフロント ベクトル (x 値を 0 に設定) と -z ベクトル (0, 0, -1) の間の角度です。ピッチは、xz 平面に投影されたフロント ベクトルと - z ベクトル、ロールは xy 平面に投影されたアップ ベクトルと +x ベクトル (1, 0, 0) の間の角度です。Fx = フロント ベクトルの x コンポーネント、Fy を y コンポーネントなどとすると、次のようになります。

yaw   = acos ( -z dot (0,  Fy, Fz) ) / sqrt(Fy*Fy + Fz*Fz)
pitch = acos ( -z dot (Fx, 0,  Fz) ) / sqrt(Fx*Fx + Fz*Fz)
roll  = acos ( +x dot (Ux, Uy, 0 ) ) / sqrt(Ux*Ux + Uy*Uy)

間違ったベクトルを選択した場合は、他のベクトルに対してこれを実行できるはずです。

于 2012-01-25T03:45:29.347 に答える