仮想現実や拡張現実のウェブアプリを開発しているデベロッパーは、DeviceOrientationEvent
に精通していることでしょう。詳しくは、This End Up: Using Device Orientation で、deviceorientation
イベント リスナーがデバイスの回転にどのように応答できるかを確認してください。
以前のバージョンの Chrome では、DeviceOrientationEvent
に含まれる alpha
、beta
、gamma
の値は、地球の座標系を基準とした 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
を使用してカスタム センサー フュージョンを実装する方法について詳しく説明しています。これらは、加速度計とジャイロスコープへの低レベル アクセスを提供し、ユーザーにより正確なバーチャル リアリティ エクスペリエンスを提供できます。