Если вы хотите рассчитать вращение вокруг оси z устройства независимо от положения устройства (то есть плоского или не плоского), вам необходимо отслеживать несколько вещей. Если приложение поддерживает как портрет, так и пейзаж, то это сложнее, я собираюсь дать ответ, когда действие ограничено только портретированием.
Плоская здесь означает, что высота тона не превышает 25 или более 155 градусов, а не в противном случае.
Когда устройство переходит от плоского к неровному, и наоборот, в пользовательском интерфейсе, вероятно, есть некоторые противоречия.
Зарегистрируйтесь для TYPE_GRAVITY
и TYPE_MAGNETIC_FIELD
(необходимо для ремонта) и выполните расчет ниже.
getRotationMatrix
а [0] а [1] [2]
а [3] [4] [5]
а [6] [7] [ 8]
Вычислить pitch = Math.asin(-R[7])
- Использование
pitch
для определения плоскостности устройства (я думаю, вы можете использовать менее 45 и более 135 для определения плоскостности, вы просто должны Эксперимент, чтобы увидеть, если значение azymuth
правильно)
, если устройство не является плоским вращение Math.atan2 (а [6], а [7])
Если устройство является плоским, чтобы начать с получить начальный azymuth = Math.atan2(R[1], R[4])
, а затем принять разницу с последующим azymuths
, чтобы получить поворот.
Если переход устройства из плоского в неровный, не должно быть никаких проблем, то поворот - это просто поворот, который не является плоским.
Если устройство переходит из не плоского в плоское, вам необходимо получить начальный номер azymuth
. Этот начальный номер azymuth
может быть установлен в направлении задней камеры Math.atan2 (-a [2], -a [5]), если устройство находится в вертикальном положении, и только вращение вокруг оси z, то это направление не должно меняться. При повторности это, вероятно, изменится на несколько градусов, поэтому вам нужно будет усреднить.
Все математика для Math.atan2 за исключением (а [6], а [7]) объясняются в Android: Algorithms for SensorManager.getRotationMatrix and SensorManager.getOrientation()
Итак, позвольте мне дать объяснение найти вращение, когда устройство не является плоским.
Как указано в приведенной выше ссылке, вы должны указать фиксированный вектор и вектор, который меняется, который вы хотите рассчитать угол между ними. В этом случае вектор, который изменяется, является вектором, лежащим в устройстве y-оси, а фиксированный вектор является проекцией вектора силы тяжести в плоскость xy устройства. В матрице вращения над последней строкой находится нормализованный вектор силы тяжести в координате устройства, поэтому проекция на плоскость xy устройства (a [6], a [7]). Теперь простая тригонометрия показывает, что Math.atan2 (a [6], a [7]) - это угол между осью устройства y и проекцией силы тяжести. (Нарисуйте картинку, если вы ее не увидите).
Этот звук, подобный гироскопу, - http://developer.android.com/guide/topics/sensors/sensors_motion.html#sensors-motion-rotate. Но я не знаю, каков фактический вопрос. –
Итак, на картинке поворот на 90 градусов повернет телефон от портрета к пейзажу. Это то, что вы хотите? Если так, то я уже ответил, что на http://stackoverflow.com/questions/11175599/how-to-measure-the-tilt-of-the-phone-in-xy-plane-using-accelerometer-in-android/ 15149421 # 15149421 с использованием только акселерометра. –
Я отправлю ответ, который позволит вам определить вращение оси z независимо от положения устройства завтра. В то же время вы должны прочитать мой ответ по адресу http://stackoverflow.com/questions/32372847/android-algorithms-for-sensormanager-getrotationmatrix-and-sensormanager-getori/35390001#35390001, чтобы получить подробный ответ на то, что getOrientation делает так, что вы можете понять ответ, который я опубликую. –