Chrome 50 でデバイスの向きが変更されます

仮想現実や拡張現実のウェブアプリを開発しているデベロッパーは、DeviceOrientationEvent に精通していることでしょう。詳しくは、This End Up: Using Device Orientation で、deviceorientation イベント リスナーがデバイスの回転にどのように応答できるかを確認してください。

以前のバージョンの Chrome では、DeviceOrientationEvent に含まれる alphabetagamma の値は、地球の座標系を基準とした absolute 度で指定されていました。絶対角度を取得するには、デバイスの磁力計センサーを使用して地球の磁場を検出する必要があります。このため、近くの磁場の変化の影響を受けやすく、測定値がずれる可能性があります。実際には、デバイス自体が実際には動いていなくても、近くにある磁石が原因でウェブアプリが大量の DeviceOrientationEvent を登録する可能性があります。向きの変化のみをトラッキングするバーチャル リアリティ アプリケーションの場合、この磁気ノイズは好ましくありません。

変更の概要

Chrome 50 以降、DeviceOrientationEvent に含まれる度数は、デフォルトで地球の座標系を基準とした絶対値ではなくなります。つまり、DeviceOrientationEvent は、デバイスの加速度センサーとジャイロスコープの組み合わせで検出された実際の動きがある場合にのみトリガーする必要があります。マグネットメーターや、磁場の変化による誤測定は考慮されません。

でも、絶対角度が必要な場合はどうすればよいですか?

絶対度を使用する必要がある JavaScript を記述している場合(たとえば、物理世界に直接マッピングする必要がある拡張現実ウェブ アプリケーションの一部として)、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 で報告される値は一貫していません。

iOS の Safari と Firefox では、度に相対値が使用されます。これは、Chrome 50 で導入された実装変更に対応しています。この変更により、iOS を念頭に置いて作成されたウェブ アプリケーションとの整合性が高まります。

Firefox(iOS 以外のプラットフォーム)、Edge、Chrome バージョン 50 より前では、適切なセンサーを備えたデバイスで実行する場合、DeviceOrientationEvent に絶対度値が使用されます。

執筆時点では、Chrome 50 が新しい DeviceOrientationAbsoluteEvent をサポートする最初のブラウザです。

DeviceMotionEvent による高度な向きトラッキング

Boris Smus非常に詳細な記事では、DeviceOrientationEvent の使用のデメリットと、DeviceMotionEvent を使用してカスタム センサー フュージョンを実装する方法について詳しく説明しています。これらは、加速度計とジャイロスコープへの低レベル アクセスを提供し、ユーザーにより正確なバーチャル リアリティ エクスペリエンスを提供できます。

参考情報