次のように、自分がどちらを向いているかを示す位置矢印を含む地図アプリを作成しています。
SensorManager.getOrientation()
最初に返された値である azimuth を使用して、から方向を直接取得します。画面が水平線の上を指すように携帯電話を保持し、縦向きにすると、矢印は正常に機能します。でも:
- 画面が水平線の下を向くように携帯電話を持っている場合、矢印はユーザーが向いている方向から 180 度離れた方向を指します。
- 画面の向きが水平線と同じ高さになるように携帯電話を持っていると、矢印はどちらを向いているのかわかりません。Azimuth は意味のある結果をまったく返しません。
- 電話を左または右に傾ける (またはランドスケープ モードで保持する) と、矢印は左または右に傾きます。
以下の慎重に構築された科学的な画像は、私が何を意味するかを示しています (青はユーザーが向いている方向、赤は矢印の方向、画面はほぼユーザーの顔を向いています。Google マップはまさに私が望んでいることを実行します):
(Google マップでは、自動回転がオフになっている場合、リストの最後の 2 つのアクションを正常に実行できないことに注意してください。しかし、私はまだその段階ではありません。一度に 1 つずつ。)
ここに示すように、単に Y 軸のポインティング方向を使用しているように見えます: http://developer.android.com/reference/android/hardware/SensorEvent.html、Z 軸のポインティング方向の逆を使用する場合、ほとんどの場合、電話が平らな場合は Y です。ただし、返される値を考えると、getOrientation()
いくつかの問題を修正するために複雑なケースを作成する必要があり、電話に面した地平線のユース ケースは解決できません。もっと簡単な方法があると確信しています。
これが私のコードです(lastAccelerationとlastMagneticFieldの両方が内部センサーからのものです):
float[] rotationMatrix = new float[9];
if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
float[] orientMatrix = new float[3];
SensorManager.getOrientation(rotationMatrix, orientMatrix);
orientation = orientMat[0]*180/(float)Math.PI;
}
私は何を間違っていますか?これを行う簡単な方法はありますか?
編集: 明確にするために、ユーザーがデバイスを目の前に持っていて、画面がユーザーの方を向いていると仮定しています。それを超えて、そのうちの1つだけが回転するかどうかは明らかにわかりません. また、ユーザーが動いているときのモーションを使用していますが、これは静止しているときのものです。