Se implementarán cambios en la orientación de los dispositivos en Chrome 50

Sin duda, los desarrolladores que trabajan en apps web de realidad virtual o aumentada están familiarizados con DeviceOrientationEvent. Para los no iniciados, “This End Up: Using Device Orientation” proporciona una excelente descripción general de cómo un objeto de escucha de eventos deviceorientation puede responder a la rotación de un dispositivo.

En versiones anteriores de Chrome, los valores de alpha, beta y gamma incluidos en DeviceOrientationEvent se proporcionaban como grados absolute en relación con el marco de coordenadas de la Tierra. Proporcionar grados absolutos requiere usar el sensor de magnetómetro del dispositivo para detectar el campo magnético de la Tierra, que a su vez es susceptible a fluctuaciones de campo magnético cercanas que podrían alterar las lecturas. En la práctica, esto podría provocar que una app web registre una gran cantidad de DeviceOrientationEvent debido a un imán cercano, a pesar de que el dispositivo en sí no se mueva. Para una aplicación de realidad virtual que solo se preocupa por hacer un seguimiento de los cambios de orientación, este ruido magnético es una mala noticia.

¿Qué cambios implementaremos?

A partir de Chrome 50, los grados incluidos en DeviceOrientationEvent ya no son absolutos de forma predeterminada en relación con el marco de coordenadas de la Tierra. Esto significa que los DeviceOrientationEvent solo deben activarse cuando hay un movimiento real, como lo detecta alguna combinación del acelerómetro y el giroscopio de un dispositivo. El magnetómetro y las lecturas falsas debido a las fluctuaciones del campo magnético están fuera de la imagen.

Pero aún necesito grados absolutos.

Si escribes JavaScript que necesita usar grados absolutos, quizás como parte de una aplicación web de realidad aumentada que debe asignarse directamente al mundo físico, no te preocupes. El comportamiento anterior, que depende del magnetómetro de un dispositivo, está disponible a través de un nuevo evento deviceorientationabsolute. Desde la perspectiva de un desarrollador, es análogo al DeviceOrientationEvent existente, con la garantía de que la propiedad absolute se establecerá en true.

Cómo detectar lo que se admite

Los desarrolladores que prefieran grados absolutos pueden usar la detección de funciones para determinar si están en un navegador que admite el nuevo evento 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.
}

Compatibilidad entre navegadores

Los valores informados en DeviceOrientationEvent nunca fueron coherentes.

Safari y Firefox en iOS usan valores relativos para los grados, lo que coincide con el cambio de implementación que se introdujo en Chrome 50. El cambio debería generar más uniformidad con las aplicaciones web que se escribieron teniendo en cuenta iOS.

Firefox (en plataformas que no sean iOS), Edge y las versiones anteriores a la 50 de Chrome usan valores de grados absolutos para DeviceOrientationEvent cuando se ejecutan en dispositivos con los sensores adecuados.

En el momento de escribir este artículo, Chrome 50 es el primer navegador que admite el nuevo DeviceOrientationAbsoluteEvent.

Seguimiento de orientación avanzado con DeviceMotionEvent

Boris Smus tiene un artículo muy detallado en el que se describen algunas de las desventajas de usar DeviceOrientationEvent y cómo implementar una fusión de sensores personalizada con DeviceMotionEvent. Proporcionan acceso de bajo nivel al acelerómetro y al giroscopio, y pueden generar una experiencia de realidad virtual más precisa para los usuarios.

Recursos adicionales