Матрица вращения определяется путем применения рулона сначала, затем высоты тона и, наконец, вращения рыскания. Вы можете получить телефон в том же положении, если сначала применить подачу, затем сверните и снова, наконец, рыскание. Вот почему вы ожидаете определенный шаг, но вы получаете неточные значения.
Чтобы убедиться в этом, поиграйте с телефоном, введя его в определенную случайную позицию, применив угловые повороты в определенном порядке, а затем попытайтесь добраться до того же положения с помощью другого порядка вращения (хорошее положение, чтобы попробовать телефон в вертикальном положении, как держать его перед лицом и слегка наклоняться в сторону).
Большую часть времени вы будете использовать код как этот
int rotation = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
if(rotation == 0) // Default display rotation is portrait
SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Y, R2);
else // Default display rotation is landscape
SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);
, чтобы сделать его более понятным. Вот как вы фактически изменили бы порядок, так как у вас все еще есть матрица вращения, определяемая с помощью рулона сначала, затем шаг и, наконец, поворот рыскания, но, тем не менее, эти вращения определены против новой системы координат XYZ.
общественного абстрактного недействительными onSensorChanged (датчик INT, плавать [] значения) Добавлено в уровне 1
API Called, когда значения датчика изменились. Длина и содержание массива значений варьируются в зависимости от того, какой датчик контролируется. Подробные сведения о возможных типах датчиков см. В разделе SensorManager.
Определение используемой системы координат.
Ось X относится к горизонтальной оси экрана (малый край в портретном режиме, длинный край в ландшафтном режиме) и указывает вправо.
Ось Y относится к вертикальной оси экрана и указывает на верхнюю часть экрана (начало координат находится в нижнем левом углу).
Ось Z указывает на небо, когда устройство лежит на спине на столе.
ВАЖНОЕ ПРИМЕЧАНИЕ. Ось заменяется при изменении ориентации экрана устройства. Чтобы получить доступ к незанятым значениям, используйте индексы 3, 4 и 5 в значениях [].
SENSOR_ORIENTATION, SENSOR_ORIENTATION_RAW:
Все значения углов в градусах.
значения [0]: азимут, вращение вокруг оси Z (0 < = азимут < 360). 0 = Север, 90 = Восток, 180 = Юг, 270 = Запад
значения [1]: Шаг, вращение вокруг оси X (-180 < = шаг < = 180), с положительными значениями при перемещении оси z к оси у.
значения [2]: рулон, вращение вокруг оси Y (-90 < = рулон < = 90), с положительными значениями, когда ось z перемещается к оси x.
Обратите внимание, что это определение рыскания, высоты тона и валка отличается от традиционного определения, используемого в авиации, где ось X расположена вдоль длинной стороны плоскости (хвост к носу).
И разница между телефонами ожидается.
Используйте SensorListeners напрямую, используя 'onSensorChanged()' FYI: http://developer.android.com/reference/android/hardware/SensorListener.html – zIronManBox