API デモ -> グラフィック ->コンパス
デバイスの自然な向きを変更しない限り、正しく機能します。ほとんどの携帯電話は縦向きで、ほとんどの 10 インチ タブレットは横向きです。変更する場合は、これを 90 度回転させる必要があります。そのシステムの 3D 修正を希望します。
100% remapCoordinateSystem()メソッドを使用する必要があります。
どのように(コード)それらの軸マッピング(理論的な数学)がどのように計算されるかの説明を見ることができれば、それはいいでしょう。
理解しようとしましたが、線形代数をすべて忘れていました。
ここでは、なぜ使用する必要があるかを示していますが、使用方法は示していません!
float R[] = new float[9];
// X (product of Y and Z) and roughly points East
// Y: points to Magnetic NORTH and tangential to ground
// Z: points to SKY and perpendicular to ground
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
それらの座標はこの位置にあるようです:
場合にのみ
getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_0
問題は、このコードを完成させる方法です: - これらのケース ブランチ
switch (mScreenRotation) {
case Surface.ROTATION_0:
Log.v("SurfaceRemap", "0 degree");
axisX = SensorManager.AXIS_X;// is this valid?
axisY = SensorManager.AXIS_Y;// is this valid?
break;
case Surface.ROTATION_90:
Log.v("SurfaceRemap", "90 degree");
// examples says remapCoordinateSystem(inR, AXIS_Y, AXIS_MINUS_X, outR);
axisX = SensorManager.AXIS_Y;
axisY = SensorManager.AXIS_MINUS_X;
break;
case Surface.ROTATION_180:
Log.v("SurfaceRemap", "180 degree");
break;
case Surface.ROTATION_270:
Log.v("SurfaceRemap", "270 degree");
break;
default:
Log.v("SurfaceRemap", "don't know the mScreenRotation value: "+mScreenRotation+" you should never seen this message!");
break;
}
boolean remapped = SensorManager.remapCoordinateSystem(R, axisX, axisY, R);
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);// All three angles above are in radians and positive in the counter-clockwise direction.
inclination = SensorManager.getInclination(I);
編集:私は小さなテストアプリケーションを書きました。画面上に画面の回転を表示します:0、90、270度(現在180度にすることはできません)
Rotation 0 が変更されていない場合 ( axisX = SensorManager.AXIS_X;axisY = SensorManager.AXIS_Y;
)、90 度は次のようになります。
axisX = SensorManager.AXIS_MINUS_Y;
axisY = SensorManager.AXIS_X;
Google のドキュメントに間違った値が記載されているよりも! 問題はどこだ!?
getRotationMatrixはこれを返します:
X はベクトル積 YZ として定義されます (デバイスの現在の位置で地面に接し、おおよそ東を指します)。
Y は、デバイスの現在の位置で地面に接しており、磁北極を指しています。
Z は空を指し、地面に対して垂直です。
上の電話を見てください!バックカメラを地面に向けて、左から右に行きたいです。
getOrientationはこれを返します:
X はベクトル積 YZ として定義されます (デバイスの現在の位置で地面に接し、おおよそ西を指します)。
Y は、デバイスの現在の位置で地面に接しており、磁北極を指しています。
Z は地球の中心を指し、地面に対して垂直です。
values[0]
: 方位角、Z 軸を中心とした回転。
values[1]
: ピッチ、X 軸周りの回転。
values[2]
: ロール、Y 軸を中心とした回転。
電話はどうあるべきですか?
最後に、航空機のような角度の値が欲しいです。北に向かっている私の電話 (私): (ヨーは方位角です)
if ScreenRotation = 0 degree
Pitch axis = -orientationAxisX = rotationAxisX
Roll axis = orientationAxisY = rotationAxisY
Yaw axis = orientationAxisZ = -rotationAxisZ