Zmiany w orientacji urządzeń niedługo pojawią się w Chrome 50

Programiści pracujący nad aplikacjami internetowymi w wirtualnej lub rozszerzonej rzeczywistości są niewątpliwie zaznajmieni z DeviceOrientationEvent. Dla początkujących: w artykule „This End Up: Using Device Orientation” („To się kończy: korzystanie z orientacji urządzenia”) znajdziesz świetny przegląd tego, jak detektor zdarzeń deviceorientation może reagować na obracanie i przekręcanie urządzenia.

W wcześniejszych wersjach Chrome wartości alpha, betagamma zawarte w DeviceOrientationEvent były podawane w absolute stopniach w układzie współrzędnych Ziemi. Podanie wartości bezwzględnej wymaga użycia czujnika magnetycznego urządzenia do wykrywania pola magnetycznego Ziemi, które jest podatne na wahania pola magnetycznego w pobliżu, które mogą zakłócać odczyty. W praktyce może to spowodować, że aplikacja internetowa zarejestruje dużą liczbę zdarzeń DeviceOrientationEvent z powodu obecności w pobliżu magnesu, mimo że samo urządzenie się nie porusza. W przypadku aplikacji rzeczywistości wirtualnej, która śledzi tylko zmiany orientacji, ten szum magnetyczny jest niekorzystny.

Co się zmienia?

Od wersji 50 Chrome współrzędne kątowe zawarte w elementach DeviceOrientationEvent nie są już domyślnie bezwzględne w układzie współrzędnych Ziemi. Oznacza to, że DeviceOrientationEvents powinny być aktywowane tylko wtedy, gdy nastąpi rzeczywisty ruch, wykrywany przez kombinację akcelerometru i żyroskopu urządzenia. Magnetometr i fałszywe odczyty z powodu fluktuacji pola magnetycznego nie są uwzględniane.

Ale nadal potrzebuję wartości bezwzględnej.

Jeśli piszesz kod JavaScript, który musi używać kątów bezwzględnych, np. w ramach aplikacji internetowej do rzeczywistości rozszerzonej, która musi być mapowana bezpośrednio na świat fizyczny, nie musisz się martwić. Poprzednie działanie, zależne od magnetometru urządzenia, jest dostępne za pomocą nowego zdarzenia deviceorientationabsolute. Z perspektywy dewelopera jest to analogiczne do istniejącej funkcji DeviceOrientationEvent, z tą różnicą, że zapewnia, że właściwość absolute zostanie ustawiona na true.

Wykrywanie obsługiwanych funkcji

Deweloperzy, którzy wolą bezwzględne wartości, mogą użyć funkcji wykrywania, aby określić, czy przeglądarka obsługuje nowe zdarzenie 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.
}

Zgodność z różnymi przeglądarkami

Wartości podawane w DeviceOrientationEvent nigdy nie były spójne.

Safari i Firefox w iOS używają wartości względnych kątów, co odpowiada zmianie implementacji wprowadzonej w Chrome 50. Ta zmiana powinna zwiększyć spójność z aplikacjami internetowymi napisanymi z myślą o systemie iOS.

Firefox (na platformach innych niż iOS), Edge i Chrome w wersjach starszych niż 50 używają wartości bezwzględnych w stopniach Celsjusza dla DeviceOrientationEvent, gdy są uruchamiane na urządzeniach z odpowiednimi czujnikami.

W momencie pisania tego tekstu Chrome 50 jest pierwszą przeglądarką, która obsługuje nowe DeviceOrientationAbsoluteEvent.

Zaawansowane śledzenie orientacji za pomocą zdarzenia DeviceMotionEvent

Boris Smus opublikował bardzo szczegółowy artykuł, w którym omawia niektóre wady DeviceOrientationEvent oraz sposób implementacji niestandardowego połączenia czujników za pomocą DeviceMotionEvent. Zapewniają one dostęp do akcelerometru i żyroskopu na niskim poziomie i mogą zapewnić użytkownikom bardziej realistyczne wrażenia z wykorzystaniem rzeczywistości wirtualnej.

Dodatkowe materiały