Матрица вращения в Android обеспечивает поворот от фрейма тела (он же устройство) к фрейму мира (он же инерционный).На экране в обычном режиме отображается обычная камера, обращенная назад.Это основной режим для планшета, поэтому в кадре устройства имеются следующие оси:
camera_x_tablet_body = (1,0,0)
camera_y_tablet_body = (0,1,0)
camera_z_tablet_body = (0,0,1)
На телефоне, где портретный режим является основным, поворот устройства в альбомную ориентацию с верхним краем, повернутым влевоis:
camera_x_phone_body = (0,-1,0)
camera_y_phone_body = (1,0,0)
camera_z_phone_body = (0,0,1)
Теперь, применяя матрицу вращения, поместим это в кадр мира, поэтому (для матрицы вращения R [] размера 9):
camera_x_tablet_world = (R[0],R[3],R[6]);
camera_y_tablet_world = (R[1],R[4],R[7]);
camera_z_tablet_world = (R[2],R[5],R[8]);
В общем, выможно использовать SensorManager.remapCoordinateSystem (), который для приведенного выше примера телефона будет Display.getRotation () = Surface.ROTATION_90, и дать ответ, который вы предоставили.Но если вы вращаетесь по-другому (например, ROTATION_270), это будет иначе.
Кроме того, в стороне: лучший способ получить ориентацию в Android - это прослушивание событий Sensor.TYPE_ROTATION_VECTOR.Они заполнены наилучшей возможной ориентацией на большинстве (то есть Gingerbread или более новых) платформ.На самом деле это векторная часть кватерниона.Вы можете получить полный кватернион, используя это (и две последние строки - способ получить RotationMatrix):
float vec[] = event.values.clone();
float quat[] = new float[4];
SensorManager.getQuaternionFromVector(quat, vec);
float [] RotMat = new float[9];
SensorManager.getRotationMatrixFromVector(RotMat, quat);
Более подробная информация по адресу: http://www.sensorplatforms.com/which-sensors-in-android-gets-direct-input-what-are-virtual-sensors