Os desenvolvedores que trabalham com apps da Web de realidade virtual ou aumentada certamente
conhecem o DeviceOrientationEvent
.
Para quem não conhece, o artigo This End Up: Using Device Orientation
oferece uma ótima visão geral de como um listener de eventos deviceorientation
pode
responder a uma torção e uma rotação do dispositivo.
Nas versões anteriores do Chrome, os valores alpha
,
beta
e gamma
incluídos no DeviceOrientationEvent
eram fornecidos como
graus absolute
em relação ao marco de coordenadas da Terra. Para fornecer graus absolutos,
é necessário usar o sensor de magnetômetro
do dispositivo para detectar o campo magnético da Terra, que, por sua vez, é suscetível a
flutuações do campo magnético próximo que podem afetar as leituras. Na
prática, isso pode levar um app da Web a registrar vários
DeviceOrientationEvent
s devido a um ímã próximo, mesmo que o dispositivo não
se mova. Para um aplicativo de realidade virtual que se preocupa apenas
em rastrear mudanças na orientação, esse ruído magnético é uma má notícia.
O que muda?
A partir do Chrome 50, os graus incluídos no DeviceOrientationEvent
não são mais absolutos em relação ao marco de coordenadas da Terra por padrão. Isso significa
que os DeviceOrientationEvent
s só podem ser acionados quando há um movimento
real, detectado por alguma combinação do acelerômetro e
do giroscópio de um dispositivo. O magnetômetro e as leituras falsas devido a flutuações do campo magnético
estão fora de questão.
Mas ainda preciso de graus absolutos.
Se você estiver escrevendo JavaScript que precisa usar graus absolutos, talvez como parte
de um aplicativo da Web de realidade aumentada que precisa ser mapeado diretamente no
mundo físico, você não está sem sorte. O comportamento anterior, dependente do
magnetômetro de um dispositivo, está disponível por um novo
evento deviceorientationabsolute
.
Do ponto de vista do desenvolvedor, é análogo ao
DeviceOrientationEvent
atual, com a garantia de que a propriedade
absolute
será definida como true
.
Como detectar o que é compatível
Os desenvolvedores que preferem graus absolutos podem usar a detecção de recursos para
determinar se estão em um navegador compatível com o novo
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.
}
Compatibilidade com vários navegadores
Os valores informados no DeviceOrientationEvent
nunca foram consistentes.
O Safari e o Firefox no iOS usam valores relativos para os graus, que correspondem à mudança de implementação introduzida no Chrome 50. A mudança deve levar a mais consistência com aplicativos da Web que foram criados pensando no iOS.
O Firefox (em plataformas diferentes do iOS), o Edge e as versões anteriores do Chrome anteriores à 50 usam valores de grau
absoluto para oDeviceOrientationEvent
quando executados em dispositivos com os sensores
adequados.
No momento em que este artigo foi escrito, o Chrome 50 era o primeiro navegador com suporte ao novo
DeviceOrientationAbsoluteEvent
.
Rastreamento avançado de orientação com o DeviceMotionEvent
Boris Smus tem um
artigo fantástico
que detalha algumas das desvantagens do uso da DeviceOrientationEvent
e
como implementar uma fusão de sensores personalizada usando
DeviceMotionEvent
s.
Eles fornecem acesso de baixo nível ao acelerômetro e ao giroscópio e podem levar
a uma experiência de realidade virtual mais precisa para seus usuários.