Android SensorManager странно, как переназначить систему координат

Демоверсии 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);

Кажется, эти координаты находятся в этой позиции: - устройство говорит в таблице (оси x и y находятся в таблице)

Только и только если

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 сейчас)

Кажется, если Вращение 0 не изменилось (axisX = SensorManager.AXIS_X;axisY = SensorManager.AXIS_Y;) чем 90 градусов должно быть:

axisX = SensorManager.AXIS_MINUS_Y;
axisY = SensorManager.AXIS_X;

чем документация гугл говорит где то неверные значения! Вопрос где ?!

getRotationMatrix верните это:

X определяется как векторное произведение Y.Z (Это касательное к земле на устройстве 'S текущее местоположение и примерно указывает на восток).

У касательной к земле на устройствеs текущее местоположение и указывает на магнитный Северный полюс.

Z указывает на небо и перпендикулярно земле.

Смотри телефон выше! Я хочу, чтобы справа налево, с задней камерой на землю.

GetOrientation верните это:

X определяется как векторное произведение Y.Z (Это касательное к земле на устройстве 'текущее местоположение и примерно указывает на запад).

У касательной к земле на устройствеs текущее местоположение и указывает на магнитный Северный полюс.

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

Ответы на вопрос(5)

Ваш ответ на вопрос