Разработчики, работающие над веб-приложениями виртуальной или дополненной реальности, несомненно, знакомы с DeviceOrientationEvent
. Для непосвященных книга « Этот конец: использование ориентации устройства » предоставляет отличный обзор того, как прослушиватель событий deviceorientation
может реагировать на скручивание и поворот устройства.
В более ранних версиях Chrome значения alpha
, beta
и gamma
, включенные в DeviceOrientationEvent
предоставлялись в absolute
градусах по отношению к системе координат Земли. Для получения абсолютных градусов необходимо использовать датчик магнитометра устройства для обнаружения магнитного поля Земли, а это, в свою очередь, чувствительно к близлежащим колебаниям магнитного поля, которые могут исказить показания. На практике это может привести к тому, что веб-приложение зарегистрирует несколько DeviceOrientationEvent
из-за близлежащего магнита, несмотря на то, что само устройство фактически не движется. Для приложения виртуальной реальности, которое заботится только об отслеживании изменений ориентации, этот магнитный шум — плохая новость.
Что меняется?
Начиная с Chrome 50, градусы, включенные в DeviceOrientationEvent
по умолчанию больше не являются абсолютными по отношению к системе координат Земли. Это означает, что DeviceOrientationEvent
должен запускаться только при фактическом движении, обнаруженном некоторой комбинацией акселерометра и гироскопа устройства. Магнитометр и ложные показания из-за флуктуаций магнитного поля не учитываются.
Но мне все равно нужны абсолютные степени!
Если вы пишете JavaScript, который должен использовать абсолютные степени, возможно, как часть веб-приложения дополненной реальности, которое должно напрямую отображаться в физическом мире, вам не повезло. Предыдущее поведение, зависящее от магнитометра устройства, доступно через новое событие deviceorientationabsolute
. С точки зрения разработчика, это аналог существующего DeviceOrientationEvent
с гарантией того, что absolute
свойству будет присвоено значение true
.
Определение того, что поддерживается
Разработчики, предпочитающие абсолютные степени, могут использовать функцию обнаружения, чтобы определить, поддерживает ли их браузер новое событие DeviceOrientationAbsoluteEvent
:
if ('ondeviceorientationabsolute' in window) {
// We can listen for the new deviceorientationabsolute event.
} else if ('ondeviceorientation' in window) {
// We can still listen for deviceorientation events.
// The `absolute` property of the event tells us whether
// or not the degrees are absolute.
}
Кроссбраузерная совместимость
Значения, указанные в DeviceOrientationEvent
никогда не были согласованными.
Safari и Firefox на iOS используют относительные значения степеней, что соответствует изменению реализации, представленному в Chrome 50. Это изменение должно привести к большей согласованности с веб-приложениями, написанными с учетом iOS.
Firefox (на платформах, отличных от iOS), Edge и Chrome версий до 50 используют абсолютные значения градусов для DeviceOrientationEvent
при запуске на устройствах с соответствующими датчиками.
На момент написания этой статьи Chrome 50 — первый браузер, поддерживающий новый DeviceOrientationAbsoluteEvent
.
Расширенное отслеживание ориентации с помощью DeviceMotionEvent
У Бориса Смуса есть фантастически подробная статья , в которой подробно описаны некоторые недостатки использования DeviceOrientationEvent
и способы реализации индивидуального объединения датчиков с помощью DeviceMotionEvent
. Они обеспечивают низкоуровневый доступ к акселерометру и гироскопу и могут обеспечить более точное восприятие виртуальной реальности для ваших пользователей.