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

バーチャル リアリティまたは拡張現実のウェブアプリを扱っているデベロッパーは、間違いなく DeviceOrientationEvent に精通しています。初心者向けに「This End Up: Using Device Orientation」で、デバイスのねじれや回転に deviceorientation イベント リスナーがどのように応答するかについて概説しています。

以前のバージョンの Chrome では、DeviceOrientationEvent に含まれる alphabetagamma の値は、地球の座標フレームを基準とする 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 で報告される値が一貫していません。

iOS 版の Safari と Firefox では角度に相対値を使用します。これは Chrome 50 で導入された実装の変更と同じです。この変更により、iOS 向けに作成されたウェブ アプリケーションとの整合性が向上します。

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

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

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

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

補足資料