デバイスの向きと動き

W3C 候補勧告草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2025/CRD-orientation-event-20250212/
最新公開バージョン:
https://www.w3.org/TR/orientation-event/
編集者ドラフト:
https://w3c.github.io/deviceorientation/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/orientation-event/
フィードバック:
public-device-apis@w3.org 件名 “[orientation-event] … メッセージトピック …” (アーカイブ)
デバイスの向きと動きリポジトリ
実装レポート:
https://wpt.fyi/results/orientation-event
編集者:
Reilly Grant (Google LLC)
Marcos Cáceres (Apple Inc.)
以前の編集者:
Raphael Kubo da Costa (Intel Corporation)
Rich Tibbett (Opera Software ASA)
Tim Volodine (Google Inc)
Steve Block (Google Inc(2012年7月まで))
Andrei Popescu (Google Inc(2012年7月まで))

概要

本仕様は、ホストデバイスの物理的な向きと動きを表すイベントを定義します。これらのイベントは、Webアプリケーションに向きや動きのデータへのアクセスを提供します。本仕様は、これらのデータの基礎となる情報源に依存しない設計となっており、さまざまな環境間での相互運用性を目指しています。

この文書のステータス

このセクションは、本書の公開時点での文書のステータスについて説明します。現在のW3C発行文書や本技術レポートの最新版は、W3C技術レポート一覧 https://www.w3.org/TR/で確認できます。

本文書は、Devices and Sensors Working GroupWeb Applications Working Groupによって、勧告プロセスを用いて候補勧告草案として公開されました。 本文書はW3C勧告となることを意図しています。

本文書へのコメントを希望される場合は、仕様リポジトリでIssueを提出してください。

候補勧告として公開されたことは、W3Cおよびそのメンバーによる承認を意味しません。候補勧告草案は、作業グループが 次回の候補勧告スナップショットに含める予定の前回の候補勧告からの変更点を統合しています。本書はドラフト文書であり、随時更新・置換・廃止される可能性があります。この文書を進行中の作業以外のものとして引用するのは不適切です。

本文書が提案勧告段階へ進むための基準は、本仕様の全機能を実装した最低2つの独立した相互運用可能なユーザーエージェントの存在です。これらは作業グループが開発したテストスイートのユーザーエージェントテストに合格することで判断されます。作業グループは進捗を追跡するための実装レポートを作成します。

本文書はW3C特許ポリシーのもとで活動するグループによって作成されました。 W3Cは、特許開示(Devices and Sensors)公開リスト特許開示(Web Applications)公開リストを、 各グループの成果物に関連して公開しています。これらのページには特許開示の方法も記載されています。 ある個人が、必須な特許請求項を含む特許について実際に知っている場合は、 W3C特許ポリシー第6節に従い情報を開示しなければなりません。

作業グループからのお知らせ、事務連絡、技術的でない事項については、 public-device-apis@w3.org購読, アーカイブ) または public-webapps@w3.org購読, アーカイブ)へメールしてください。

本文書は2023年11月3日改定のW3Cプロセス文書に準拠しています。

候補勧告として公開された以降の新機能としては、Permissions PolicyやAPIの統合があり、デバイスの向きデータにアクセスする際に明示的なユーザー同意がrequestPermission()経由で必要となりました。座標系の説明や精度要件も更新され、受動的なフィンガープリントリスク軽減に対応しています。deviceorientationabsoluteイベントの導入は、絶対的な向きデータを必要とするアプリケーションを強化します(リスクありとしてマーク)。インターフェースはセキュアコンテキストでのみ利用可能となり、セキュリティとプライバシーの考慮事項は規範的になりました。また、仕様はこのAPIのテストの自動化手段も提供しています(リスクありとしてマーク)。詳細は§ 10 変更点セクションを参照してください。

1. はじめに

このセクションは規範的ではありません。

この仕様は、ホストデバイスの物理的な向きや動きに関する情報を取得するための2つの新しいDOMイベントを提供します。イベントが提供する情報は生のセンサーデータではなく、情報源に依存しない高レベルのデータです。代表的な情報源にはジャイロスコープ、コンパス、加速度計などが含まれます。

deviceorientation イベントは、デバイスの物理的な向きをローカル座標系からの一連の回転として表します。

devicemotion イベントは、デバイスの加速度をデバイス内で定義された座標系の直交座標で表します。また、デバイスのローカル座標系まわりの回転率も提供します。可能な限り、イベントはデバイスの重心の加速度を提供すべきです。

以下のコード例はイベントの基本的な利用方法を示します。

deviceorientation イベントを受信するための登録例:
window.addEventListener("deviceorientation", event => {
  // event.alpha, event.beta, event.gamma を処理
});

// または...
window.ondeviceorientation = event => {
  // event.alpha, event.beta, event.gamma を処理
};
デバイスが水平な面に平らに置かれ、画面上部が西を向いている場合の向き:
{
  alpha: 90,
  beta: 0,
  gamma: 0
};

方位角を取得するには、alpha を360度から単純に引きます。デバイスを水平面上で回転させると、方位角は (360 - alpha) となります。

ユーザーがデバイスを手に持ち、画面が垂直面で上部が上を向いている場合、beta の値は90となり、alphagamma の値に関わらず一定です。
ユーザーがalpha度の方位でデバイスを手に持ち、画面が垂直面で上部が右を向いている場合のデバイスの向き:
{
  alpha: 270 - alpha,
  beta: 0,
  gamma: 90
};
devicemotion イベントを受信するための登録例:
window.addEventListener("devicemotion", (event) => {
  // event.acceleration, event.accelerationIncludingGravity,
  // event.rotationRate, event.interval を処理
});

// または...
window.ondevicemotion = (event) => {
  // event.acceleration, event.accelerationIncludingGravity,
  // event.rotationRate, event.interval を処理
};
デバイスが水平な面に平らに置かれ、画面が上を向いている場合、acceleration はゼロで、accelerationIncludingGravity の値は以下の通りです:
{
  x: 0,
  y: 0,
  z: 9.8
};
デバイスが自由落下しており、画面が水平で上を向いている場合、accelerationIncludingGravity はゼロで、accelerationの値は以下の通りです:
{
  x: 0,
  y: 0,
  z: -9.8
};
デバイスが車両に搭載され、画面が垂直面で上部が上を向き、車両の後方を向いている場合。車両が半径rの右カーブを速度vで走行しているとき、デバイスはacceleration および accelerationIncludingGravity の両方でx成分が正となります。さらに rotationRate.gamma の値は負となります:
{
  acceleration: {x: v^2/r, y: 0, z: 0},
  accelerationIncludingGravity: {x: v^2/r, y: 9.8, z: 0},
  rotationRate: {alpha: 0, beta: 0, gamma: -v/r*180/pi}
};

2. 対象範囲

このセクションは規範的ではありません。

本仕様の対象範囲は、ホストデバイスの物理的な向きと動きを表すイベントです。範囲外となるものは、変換ライブラリのような向きデータの操作用ユーティリティや、生のセンサーデータへのアクセス、これらのセンサーへ直接インターフェースするための方法などです。

3. モデル

3.1. デバイスの向き

本仕様は、デバイスの物理的な向きを実装定義の参照座標系に対する一連の回転として表現します。

回転ステップの順序は、Z - X' - Y'' 型のイントリンジックTait-Bryan角([EULERANGLES])の組み合わせであり、 デバイス座標系[ACCELEROMETER]で定義)上で適用されます。概要は以下の通りです:

携帯電話やタブレットなどのモバイルデバイスの場合、デバイス座標系は画面が標準の向き(通常は縦向き)にあるときの画面基準で定義されます。つまり、スライド式キーボードなどの要素は収納され、回転式ディスプレイなどは初期位置に折りたたまれています。

デバイスが回転したりスライド式キーボードが展開されたときに画面の向きが変わっても、座標系の向きはデバイス相対で変化しません。

ノートPCの場合、デバイス座標系は内蔵キーボード基準で定義されます。

注: 画面の向きの変化を検出したい場合は、[SCREEN-ORIENTATION]を参照してください。

回転は右手系規則で行われ、軸の正方向から見て時計回りが正の回転です。

注: 本仕様の座標系は、CSS Transforms 2 § 4 The Transform Rendering Modelとは異なり、y軸が下方向に正、回転は左手系規則です。 また、rotateSelf() およびrotate()[GEOMETRY-1]で定義)は、Z - Y' - X''順で回転を適用します。これは本仕様とは順序が異なります。

alphabetagammaによる回転は、以下の手順で行われます:

  1. デバイス座標系をz軸まわりにalpha度回転します。alphaの範囲は[0, 360)です。

    start orientation
    デバイスが初期位置にあり、参照(XYZ)と本体(xyz)座標系が一致している状態。
    rotation about z axis
    デバイスがz軸まわりにalpha度回転した状態。x軸とy軸の元の位置がx0とy0として示されています。
  2. デバイス座標系をx軸まわりにbeta度回転します。betaの範囲は[-180, 180)です。

    rotation about x axis
    デバイスが新しいx軸まわりにbeta度回転した状態。y軸とz軸の元の位置がy0とz0として示されています。
  3. デバイス座標系をy軸まわりにgamma度回転します。gammaの範囲は[-90, 90)です。

    rotation about y axis
    デバイスが新しいy軸まわりにgamma度回転した状態。x軸とz軸の元の位置がx0とz0として示されています。

注: この角度の選択は数学的慣例に従ったものですが、alphaはコンパス方位と逆向きになります。また、これらの角度は車両ダイナミクスで使われるロール・ピッチ・ヨーの慣例とは一致しません。

3.1.1. 参照座標系の選択

デバイスの向きは常に他の座標系に対する相対位置として表現され、その選択によって向きが示す情報や向きデータの情報源が決まります。

相対デバイスの向きは加速度計とジャイロスコープで計測され、参照座標系は任意です。そのため、向きデータはデバイスの初期位置からの変化のみを示します。

注: ネイティブプラットフォームでは、これはWindowsのOrientationSensor(相対)、 Androidのgame rotation vector sensor、 あるいはCore MotionのxArbitraryZVerticalオプションに類似します。

絶対的な向きは加速度計、ジャイロスコープ、磁力計で計測され、参照座標系は地球の参照座標系です。

注: ネイティブプラットフォームでは、これはWindowsのOrientationSensor(絶対)、 Androidのrotation vector sensor、 あるいはCore MotionのxMagneticNorthZVerticalオプションに類似します。

3.2. デバイスの動き

本仕様では、加速度計とジャイロスコープから取得した加速度と回転率を計測することで、空間におけるデバイスの動きを表現します。データは前節でまとめたデバイス座標系に対して提供されます。

加速度は単位時間あたりの速度の変化率で、単位はメートル毎秒毎秒(m/s2)です。

線形デバイス加速度は重力成分を除いたデバイスの加速度率を表します。デバイスが机の上に平らに置かれている場合、線形加速度は0 m/s2です。

加速度が重力を含む場合、その値には重力の影響が含まれ、固有加速度([PROPERACCELERATION])を表します。デバイスが自由落下中の場合、加速度は0 m/s2です。これは多くの用途ではあまり有用ではありませんが、ジャイロスコープの非搭載などで線形加速度を提供できない実装に対するベストエフォートの手段です。

注: 実際には、重力を含む加速度Motion Sensors Explainer § accelerometer[G-FORCE]の生データに相当し、線形加速度Motion Sensors Explainer § linear-acceleration-sensorの値であり、融合センサーである可能性が高いです。[MOTION-SENSORS]および[ACCELEROMETER]には加速度計の種類や計測可能な加速度の詳細な解説があります。

回転率は、デバイス座標系の指定軸まわりでデバイスが回転する速度を測定します。デバイスの向きと同様、回転は右手系規則であり、軸の正方向から見て時計回りが正です。回転率は毎秒の度数(deg/s)で表されます。

注: [MOTION-SENSORS][GYROSCOPE]にはジャイロスコープ、回転率、計測方法についての詳細な解説があります。

4. 権限

この統合は、リスクありです。理由は、DeviceMotionEvent.requestPermission() および DeviceOrientationEvent.requestPermission() テストの合格率が低いためです。

本仕様は強力な機能であり、以下の権限を定義します。これらはポリシー管理機能であり、以下のデフォルト許可リストが設定されています:

注: どのイベントがdispatch(発行)されるかは、どの権限許可されたかによって決まります:

5. タスクソース

タスクソースは、本仕様で言及されているタスクのためのデバイス動き・向きタスクソースです。

6. API

6.1. deviceorientationイベント

partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientation;
};

[Exposed=Window, SecureContext]
interface DeviceOrientationEvent : Event {
    constructor(DOMString type, optional DeviceOrientationEventInit eventInitDict = {});
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
    readonly attribute boolean absolute;

    static Promise<PermissionState> requestPermission(optional boolean absolute = false);
};

dictionary DeviceOrientationEventInit : EventInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
    boolean absolute = false;
};

ondeviceorientation属性は、イベントハンドラーIDL属性であり、 ondeviceorientation イベントハンドラーのためのものです。そのイベントハンドラーイベントタイプdeviceorientationです。

alpha属性は、初期化時の値を返すものとします。これは、§ 3.1 デバイスの向きで説明されているZ - X' - Y''型のイントリンジックTait-Bryan角におけるZ軸まわりの回転を表します。

beta属性は、初期化時の値を返すものとします。これは、§ 3.1 デバイスの向きで説明されている、Z軸まわりの回転が適用された後のX'軸まわりの回転を表します。

gamma属性は、初期化時の値を返すものとします。これは、§ 3.1 デバイスの向きで説明されている、Z軸・X'軸の回転がこの順序で適用された後のY''軸まわりの回転を表します。

absolute属性は、初期化時の値を返すものとします。これは、相対的な向き絶対的な向きのデータが提供されているかどうかを示します。

requestPermission(absolute) メソッドの手順は以下の通りです:
  1. global現在のグローバルオブジェクトとする。

  2. hasTransientActivationを、this関連グローバルオブジェクト一時的なアクティベーションを持つ場合はtrue、そうでなければfalseとする。

  3. promiseを、新しいpromisethis関連Realm)とする。

  4. permissionsを « "accelerometer", "gyroscope" » とする。

  5. absoluteがtrueの場合、append "magnetometer" » をpermissionsに追加する。

  6. 以下の手順を並行して実行する:

    1. permissionsnameについて:

      1. name権限状態が"prompt" であり、hasTransientActivationがfalseの場合:

        1. グローバルタスクをキューに追加し、デバイス動き・向きタスクソースglobalを指定してpromiseを"NotAllowedError" DOMExceptionでrejectする。

        2. 戻る。

    2. permissionStateを"granted" とする。

    3. permissionsnameについて:

      注: 複数の権限を一度にリクエストするアルゴリズムはありませんが、ユーザーエージェントは異なるメディアへの同時リクエストを一つのユーザー向け権限プロンプトにまとめることが推奨されます。

      1. 権限利用のリクエストの結果が"granted"でない場合:

        1. permissionStateを"denied" に設定する。

        2. breakする。

    4. グローバルタスクをキューに追加し、デバイス動き・向きタスクソースglobalを指定してpermissionStatepromiseをresolveする。

  7. promiseを返す。

向きイベントを発火する手順は、DOMString eventWindow windowboolean absoluteが与えられた場合、以下の通りです:
  1. orientationをnullとする。

  2. topLevelTraversablewindownavigable最上位トラバーサブルとする。

  3. virtualSensorTypeを "relative-orientation" (absoluteがfalseの場合)、または "absolute-orientation" (trueの場合)とする。

  4. もしtopLevelTraversable仮想センサーマッピングvirtualSensorType含む場合:

    1. virtualSensortopLevelTraversable仮想センサーマッピング[virtualSensorType]とする。

    2. もしvirtualSensor読み取り可能フラグがtrueの場合:

      1. orientationを、"alpha", "beta", "gamma"キー付きでvirtualSensorに提供された最新の読み取り値とする。

  5. それ以外の場合:

    1. absoluteがfalseの場合:

      1. orientationを、デバイスの相対的な向き(三次元空間)とする。

    2. それ以外の場合:

      1. orientationを、デバイスの絶対的な向き(三次元空間)とする。

  6. permissionsをnullとする。

  7. absoluteがfalseの場合:

    1. permissionsを « "accelerometer", "gyroscope" » とする。

  8. それ以外の場合:

    1. permissionsを « "accelerometer", "gyroscope", "magnetometer" » とする。

  9. environmentwindow関連設定オブジェクトとする。

  10. 以下の手順を並行して実行する:

    1. permissionspermissionについて:

      1. stateを、現在の権限状態の取得permissionenvironmentを使って取得する。

      2. stateが"granted"でない場合、戻る。

    2. グローバルタスクをキューに追加し、デバイス動き・向きタスクソースwindowを指定して以下を実行:

      1. zを、orientationのZ - X' - Y''型Tait-Bryan角によるZ軸方向値(実装が値を提供できない場合はnull)とする。

      2. zがnullでない場合、zの精度を0.1度に制限する。

      3. xを、orientationのZ - X' - Y''型Tait-Bryan角によるX'軸方向値(実装が値を提供できない場合はnull)とする。

      4. xがnullでない場合、xの精度を0.1度に制限する。

      5. yを、orientationのZ - X' - Y''型Tait-Bryan角によるY''軸方向値(実装が値を提供できない場合はnull)とする。

      6. yがnullでない場合、yの精度を0.1度に制限する。

      7. イベントを発火し、イベント名はevent、対象はwindow、型はDeviceOrientationEventalpha属性はzbeta属性はxgamma属性はyabsolute属性はabsoluteで初期化する。

向きの重要な変化とは、前回の値と比べて、deviceorientationまたはdeviceorientationabsoluteイベントの発火に値するほどの違いがあることを示します。向きの重要な変化が発生したかどうかの判定は実装定義ですが、変化の最大閾値として1度が推奨されます。実装は、ページが十分に新鮮なデータを持っていないと考える場合にも発生したとみなしても構いません。

注: 実装は§ 9 自動化を考慮し、仮想センサーの読み取り更新によって向きの重要な変化の判定が行われるようにしなければなりません。

向きの重要な変化が発生した場合、ユーザーエージェントはnavigableアクティブウィンドウwindowで以下を実行しなければなりません:
  1. documentwindow関連付けられたDocumentとする。

  2. documentvisibility state"visible"でない場合、戻る。

  3. absoluteをfalseとする。

  4. featuresを « "accelerometer", "gyroscope" » とする。

  5. 実装が相対的な向きを提供できない場合や、結果として得られる絶対的な向きデータがより正確な場合:

    1. absoluteをtrueにする。

    2. append "magnetometer"featuresに追加する。

  6. featuresfeatureについて:

    1. document利用可能でない場合、戻る。

  7. 向きイベントを発火するdeviceorientationwindowabsolute)。

実装が向き情報を一切提供できない場合、alphabeta およびgamma属性はnullとし、absolute属性はfalseとするべきです。

6.2. deviceorientationabsoluteイベント

deviceorientationabsolute イベントおよびondeviceorientationabsolute イベントハンドラーIDL属性は、リスクありです。理由は実装経験が限られているためです。
partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientationabsolute;
};

ondeviceorientationabsolute属性は、イベントハンドラーIDL属性であり、 ondeviceorientationabsolute イベントハンドラーのためのものです。そのイベントハンドラーイベントタイプdeviceorientationabsoluteです。

deviceorientationabsoluteイベントは、deviceorientationイベントと完全に類似していますが、必ず絶対的な向きデータを提供しなければなりません。

向きの重要な変化が発生した場合、ユーザーエージェントはnavigableアクティブウィンドウwindowで以下を実行しなければなりません:
  1. 向きイベントを発火するdeviceorientationabsolutewindow、true)。

実装が絶対的な向き情報を一切提供できない場合、イベントはalphabeta およびgamma属性はnullとし、absolute属性はtrueとするべきです。

6.3. devicemotionイベント

6.3.1. DeviceMotionEventAccelerationインターフェース

[Exposed=Window, SecureContext]
interface DeviceMotionEventAcceleration {
    readonly attribute double? x;
    readonly attribute double? y;
    readonly attribute double? z;
};

DeviceMotionEventAcceleration インターフェースは、§ 3.2 デバイスの動きで説明されているデバイスの加速度を表します。次のデータが関連付けられています:

x軸加速度

デバイスのX軸方向の加速度率。nullの場合もあります。初期値はnullです。

y軸加速度

デバイスのY軸方向の加速度率。nullの場合もあります。初期値はnullです。

z軸加速度

デバイスのZ軸方向の加速度率。nullの場合もあります。初期値はnullです。

xゲッターの手順は、thisx軸加速度の値を返すことです。

yゲッターの手順は、thisy軸加速度の値を返すことです。

zゲッターの手順は、thisz軸加速度の値を返すことです。

6.3.2. DeviceMotionEventRotationRateインターフェース

[Exposed=Window, SecureContext]
interface DeviceMotionEventRotationRate {
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
};

DeviceMotionEventRotationRate インターフェースは、回転率§ 3.2 デバイスの動き参照)を表します。次のデータが関連付けられています:

x軸回転率

デバイスのX軸まわりの回転率。nullの場合もあります。初期値はnullです。

y軸回転率

デバイスのY軸まわりの回転率。nullの場合もあります。初期値はnullです。

z軸回転率

デバイスのZ軸まわりの回転率。nullの場合もあります。初期値はnullです。

alphaゲッターの手順は、thisx軸回転率の値を返すことです。

betaゲッターの手順は、thisy軸回転率の値を返すことです。

gammaゲッターの手順は、thisz軸回転率の値を返すことです。

6.3.3. DeviceMotionEventインターフェース

partial interface Window {
    [SecureContext] attribute EventHandler ondevicemotion;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEvent : Event {
    constructor(DOMString type, optional DeviceMotionEventInit eventInitDict = {});
    readonly attribute DeviceMotionEventAcceleration? acceleration;
    readonly attribute DeviceMotionEventAcceleration? accelerationIncludingGravity;
    readonly attribute DeviceMotionEventRotationRate? rotationRate;
    readonly attribute double interval;

    static Promise<PermissionState> requestPermission();
};

dictionary DeviceMotionEventAccelerationInit {
    double? x = null;
    double? y = null;
    double? z = null;
};

dictionary DeviceMotionEventRotationRateInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
};

dictionary DeviceMotionEventInit : EventInit {
    DeviceMotionEventAccelerationInit acceleration;
    DeviceMotionEventAccelerationInit accelerationIncludingGravity;
    DeviceMotionEventRotationRateInit rotationRate;
    double interval = 0;
};

ondevicemotion属性は、イベントハンドラーIDL属性であり、 ondevicemotion イベントハンドラーのためのものです。そのイベントハンドラーイベントタイプdevicemotionです。

acceleration属性は、初期化された値を返すものとします。オブジェクト作成時、この属性はnullで初期化されなければなりません。これはデバイスの線形加速度を表します。

accelerationIncludingGravity 属性は、初期化された値を返すものとします。オブジェクト作成時、この属性はnullで初期化されなければなりません。これはデバイスの重力を含む加速度を表します。

rotationRate属性は、初期化された値を返すものとします。オブジェクト作成時、この属性はnullで初期化されなければなりません。これはデバイスの回転率を表します。

interval属性は、初期化された値を返すものとします。これは基礎となるハードウェアからデータが取得される間隔を表し、ミリ秒(ms)単位で表現される必要があります。Webアプリケーションでデータのフィルタリングを簡素化するため一定値となります。

requestPermission()メソッドの手順は以下の通りです:
  1. global現在のグローバルオブジェクトとする。

  2. hasTransientActivationを、this関連グローバルオブジェクト一時的なアクティベーションを持つ場合はtrue、そうでなければfalseとする。

  3. result新しいpromisethis関連Realm)とする。

  4. 以下の手順を並行して実行する:

    1. permissionsを « "accelerometer", "gyroscope" » とする。

    2. permissionsnameについて:

      1. name権限状態が"prompt" であり、hasTransientActivationがfalseの場合:

        1. グローバルタスクをキューに追加し、デバイス動き・向きタスクソースglobalを指定してresultを"NotAllowedError" DOMExceptionでrejectする。

        2. 戻る。

    3. permissionStateを"granted" とする。

    4. permissionsnameについて:

      注: 複数の権限を一度にリクエストするアルゴリズムはありませんが、ユーザーエージェントは異なるメディアへの同時リクエストを一つのユーザー向け権限プロンプトにまとめることが推奨されます。

      1. 権限利用のリクエストの結果が"granted"でない場合:

        1. permissionStateを"denied" に設定する。

        2. breakする。

    5. グローバルタスクをキューに追加し、デバイス動き・向きタスクソースglobalを指定してpermissionStateresultをresolveする。

  5. resultを返す。

実装定義の間隔intervalごとに、ユーザーエージェントはnavigableアクティブウィンドウwindowで以下を実行しなければなりません:
  1. documentwindow関連付けられたDocumentとする。

  2. documentvisibility stateが"visible"でない場合、戻る。

  3. « "accelerometer", "gyroscope" »のpolicyについて:

    1. documentallowed to use(利用可能)でない場合、戻る。

  4. topLevelTraversablewindownavigable最上位トラバーサブルとする。

  5. platformLinearAccelerationをnullとする。

  6. もしtopLevelTraversable仮想センサーマッピングが"linear-acceleration"を含む場合:

    1. virtualSensortopLevelTraversable仮想センサーマッピング["linear-acceleration"]とする。

    2. もしvirtualSensor読み取り可能フラグがtrueなら、platformLinearAccelerationvirtualSensorの最新読み取り値をセットする。

  7. それ以外で実装が線形加速度を提供可能な場合:

    1. platformLinearAccelerationにデバイスの線形加速度(X、Y、Z軸)をセットする。

  8. accelerationをnullとする。

  9. platformLinearAccelerationがnullでない場合:

    1. accelerationwindowrealm新規作成したDeviceMotionEventAccelerationとする。

    2. accelerationx軸加速度platformLinearAccelerationのX軸値(提供できない場合はnull)をセットする。

    3. accelerationx軸加速度がnullでなければ、その精度を最大0.1 m/s2に制限する。

    4. accelerationy軸加速度platformLinearAccelerationのY軸値(提供できない場合はnull)をセットする。

    5. accelerationy軸加速度がnullでなければ、その精度を最大0.1 m/s2に制限する。

    6. accelerationz軸加速度platformLinearAccelerationのZ軸値(提供できない場合はnull)をセットする。

    7. accelerationz軸加速度がnullでなければ、その精度を最大0.1 m/s2に制限する。

  10. platformAccelerationIncludingGravityをnullとする。

  11. もしtopLevelTraversable仮想センサーマッピングが"accelerometer"を含む場合:

    1. virtualSensortopLevelTraversable仮想センサーマッピング["accelerometer"]とする。

    2. もしvirtualSensor読み取り可能フラグがtrueなら、platformAccelerationIncludingGravityvirtualSensorの最新読み取り値をセットする。

  12. それ以外で実装が重力を含む加速度を提供可能な場合:

    1. platformAccelerationIncludingGravityにデバイスの線形加速度(X、Y、Z軸)をセットする。

  13. accelerationIncludingGravityをnullとする。

  14. platformAccelerationIncludingGravityがnullでない場合:

    1. accelerationIncludingGravitywindowrealm新規作成したDeviceMotionEventAccelerationとする。

    2. accelerationIncludingGravityx軸加速度platformAccelerationIncludingGravityのX軸値(提供できない場合はnull)をセットする。

    3. accelerationIncludingGravityx軸加速度がnullでなければ、その精度を最大0.1 m/s2に制限する。

    4. accelerationIncludingGravityy軸加速度platformAccelerationIncludingGravityのY軸値(提供できない場合はnull)をセットする。

    5. accelerationIncludingGravityy軸加速度がnullでなければ、その精度を最大0.1 m/s2に制限する。

    6. accelerationIncludingGravityz軸加速度platformAccelerationIncludingGravityのZ軸値(提供できない場合はnull)をセットする。

    7. accelerationIncludingGravityz軸加速度がnullでなければ、その精度を最大0.1 m/s2に制限する。

  15. platformRotationRateをnullとする。

  16. もしtopLevelTraversable仮想センサーマッピングが"gyroscope"を含む場合:

    1. virtualSensortopLevelTraversable仮想センサーマッピング["gyroscope"]とする。

    2. もしvirtualSensor読み取り可能フラグがtrueなら、platformRotationRatevirtualSensorの最新読み取り値をセットする。

  17. それ以外で実装が回転率を提供可能な場合:

    1. platformRotationRateにデバイスの回転率(X、Y、Z軸)をセットする。

  18. rotationRateをnullとする。

  19. platformRotationRateがnullでない場合:

    1. rotationRatewindowrealm新規作成したDeviceMotionEventRotationRateとする。

    2. rotationRatex軸回転率platformRotationRateのX軸値(提供できない場合はnull)をセットする。

    3. rotationRatex軸回転率がnullでなければ、その精度を最大0.1 deg/sに制限する。

    4. rotationRatey軸回転率platformRotationRateのY軸値(提供できない場合はnull)をセットする。

    5. rotationRatey軸回転率がnullでなければ、その精度を最大0.1 deg/sに制限する。

    6. rotationRatez軸回転率platformRotationRateのZ軸値(提供できない場合はnull)をセットする。

    7. rotationRatez軸回転率がnullでなければ、その精度を最大0.1 deg/sに制限する。

  20. environmentwindow関連設定オブジェクトとする。

  21. 以下の手順を並行して実行する:

    1. « "accelerometer", "gyroscope" »のpermissionについて:

      1. stateを、現在の権限状態の取得permissionenvironmentを使って取得する。

      2. stateが"granted"でない場合、戻る。

    2. グローバルタスクをキューに追加し、デバイス動き・向きタスクソースwindowを指定して以下を実行:

      1. イベントを発火し、イベント名は"devicemotion"、対象はwindow、型はDeviceMotionEventacceleration属性はaccelerationaccelerationIncludingGravity属性はaccelerationIncludingGravityrotationRate属性はrotationRateinterval属性はintervalで初期化する。

実装が動き情報を一切提供できない場合、イベントはaccelerationaccelerationIncludingGravity およびrotationRate属性はnullとするべきです。

7. セキュリティとプライバシーの考慮事項

本仕様で定義されるAPIは、加速度計、ジャイロスコープ、磁力計などのハードウェアセンサーから情報を取得するために利用できます。提供されるデータは機密情報とみなされる場合があり、悪意のあるウェブページによる攻撃の対象となる可能性があります。加速度計、ジャイロスコープ、磁力計のキャリブレーション情報は、特定のセンサーハードウェアに関する永続的な詳細を明らかにすることがあります[SENSORID]。主な攻撃ベクトルは、以下のカテゴリに分類されます:

これを踏まえ、実装ではウェブページがセンサーを使用していることを示す視覚的なインジケーターを検討することができます。さらに、本仕様はユーザーがrequestPermission() API呼び出しを通じてデバイスの動きや向きデータを提供することに明示的に許可することを要求します。

加えて、プライバシーリスクやフィンガープリントなどの攻撃機会を最小化するため、実装は以下を必須とします:

これらの項目を実装することで、モバイル機器のバッテリー寿命にも良い影響を与える場合があります。

最大サンプリング周波数の制限について更なる実装経験が収集されています。

8. アクセシビリティの考慮事項

DeviceOrientationイベントは新しい入力手段を提供し、ユーザーに新しいインタラクションの可能性を開きます。できるだけ多くの人があなたの作る体験にアクセスできるよう、以下を考慮してください:

ユーザーエージェントまたは基盤となるOSによって管理される可能性が高い2つのニーズがありますが、あなたのコンテンツやアプリが利用される方法として、これらを念頭に置くことは有益です。

9. 自動化

この機能は、リスクありです。理由は実装経験が限られているためです。

本仕様で定義されるイベントは物理的なハードウェアの存在とその値に依存するため、テスト著者にとって課題となる場合があります。

この課題への対応として、本書は[WEBDRIVER2]拡張コマンドと、Generic Sensor API § 9 自動化のインフラに基づいています。これは、完全に新しい独立したインフラや別の拡張コマンドを開発するよりも、2つの仕様間に大きな重複があるため選ばれました。[GENERIC-SENSOR]仕様のテストも同様の課題があり、多くの派生API(例:[GYROSCOPE])が類似の情報を取得・提供します。

本仕様は、Generic Sensor API § 9 自動化セクションのみサポートすることを要求します。インターフェースやイベント自体は要求しません。

9.1. デバイス向きの自動化

deviceorientationイベントの自動化サポートは、加速度計・ジャイロスコープ・(オプションで)磁力計を表現する仮想センサー上に構築されています。

ユーザーエージェントがプラットフォームから取得する向きデータは、加速度計・ジャイロスコープ・(オプションで)磁力計から取得されます。動きデータとは異なり、これらの低レベルの値は§ 3.1 デバイスの向きで記述された形でオイラー角に変換されなければなりません。さらに、プラットフォームが生の加速度・回転データからこれらの変換を行う追加APIをユーザーエージェントに提供する場合もあります。

したがって、実装や自動化の利用者に対して、異なる単位系の低レベル仮想センサー経由で向き読み取り値を提供させるのではなく、本仕様で使われる形式の相対・絶対向きデータ用の仮想センサータイプを追加で定義しています。

9.1.1. 向きデータ読み取りアルゴリズムの解析

向きデータ読み取り解析アルゴリズムは、JSON Object parametersが与えられたとき、以下を行います:
  1. alphaparametersから"alpha"でプロパティ取得で取得する。

  2. alphaNumber型でない場合、または値がNaN, +∞, −∞ならundefinedを返す。

  3. alphaが[0, 360)の範囲でなければundefinedを返す。

  4. betaparametersから"beta"でプロパティ取得で取得する。

  5. betaNumber型でない場合、または値がNaN, +∞, −∞ならundefinedを返す。

  6. betaが[-180, 180)の範囲でなければundefinedを返す。

  7. gammaparametersから"gamma"でプロパティ取得で取得する。

  8. gammaNumber型でない場合、または値がNaN, +∞, −∞ならundefinedを返す。

  9. gammaが[-90, 90)の範囲でなければundefinedを返す。

  10. 新しい順序付きマップ«[ "alpha" → alpha, "beta" → beta, "gamma" → gamma ]»を返す。

注: 返り値は順序付きマップであり、センサー読み取り概念への依存を避けるためです。上記アルゴリズムの目的には互換性があります。

9.1.2. "absolute-orientation"仮想センサータイプ

タイプごとの仮想センサーメタデータマップは、以下のエントリを持たなければなりません:

キー

"absolute-orientation"

仮想センサーメタデータであり、その読み取り解析アルゴリズム向きデータ読み取り解析です。

9.1.3. "relative-orientation"仮想センサータイプ

タイプごとの仮想センサーメタデータマップは、以下のエントリを持たなければなりません:

キー

"relative-orientation"

仮想センサーメタデータであり、その読み取り解析アルゴリズム向きデータ読み取り解析です。

9.2. デバイス動きの自動化

ユーザーエージェントがプラットフォームから取得する動きデータは加速度計・ジャイロスコープから取得されます。本仕様は、[ACCELEROMETER][GYROSCOPE]仕様と共有する特定のタイプごとの仮想センサーメタデータエントリを定義します。

加速度計仮想センサーは、プラットフォームに重力を含む加速度データを提供します。線形加速度仮想センサーは、プラットフォームに線形加速度データを提供します。ジャイロスコープ仮想センサーは、プラットフォームに回転率データを提供します。

9.2.1. "accelerometer"仮想センサータイプ

タイプごとの仮想センサーメタデータマップは、以下のエントリを持たなければなりません:

キー

"accelerometer"

仮想センサーメタデータであり、その読み取り解析アルゴリズムxyz読み取り解析です。

9.2.2. "linear-acceleration"仮想センサータイプ

タイプごとの仮想センサーメタデータマップは、以下のエントリを持たなければなりません:

キー

"linear-acceleration"

仮想センサーメタデータであり、その読み取り解析アルゴリズムxyz読み取り解析です。

9.2.3. "gyroscope"仮想センサータイプ

タイプごとの仮想センサーメタデータマップは、以下のエントリを持たなければなりません:

キー

"ジャイロスコープ仮想センサータイプ"

仮想センサーのメタデータであり、その読み取り解析アルゴリズムXYZ読み取り解析です。

付録A 例

このセクションは規範的ではありません。

A.1 方位角の計算例

このセクションは規範的ではありません。

以下の具体例は、DeviceOrientationイベントの利用者向けの補助を目的としています。

はじめにセクションでは、DeviceOrientationイベントを使ってデバイスを水平に持ったときに方位角を取得する例を示しました。この例では、デバイスを垂直に持ったときにユーザーが向いている方位角を判定する方法を示します。応用例としてはAR(拡張現実)システムなどがあります。

より正確には、デバイス画面に垂直で画面背面側へ伸びるベクトルの水平成分の方位角を求めたいということになります。

このベクトルvを回転後の本体座標系xyzで表すと、vは次の通りです。

v = [0; 0; -1]

vのz軸回りの回転による変換は、次の回転行列で表されます。

Z = [cos(alpha) -sin(alpha) 0; sin(alpha) cos(alpha) 0; 0 0 1]

vのx軸回りの回転による変換は、次の回転行列で表されます。

X = [1 0 0; 0 cos(beta) -sin(beta); 0 sin(beta) cos(beta)]

vのy軸回りの回転による変換は、次の回転行列で表されます。

Y = [cos(gamma) 0 sin(gamma); 0 1 0; -sin(gamma) 0 cos(gamma)]

Rがデバイスの地球座標系XYZでの完全な回転行列だとすると、初期本体座標系が地球座標系に一致しているので、Rは次のようになります。

R = ZXY = [[cos(alpha) cos(gamma)-sin(alpha) sin(beta) sin(gamma), -cos(beta) sin(alpha), cos(gamma) sin(alpha) sin(beta)+cos(alpha) sin(gamma)], [cos(gamma) sin(alpha)+cos(alpha) sin(beta) sin(gamma), cos(alpha) cos(beta), sin(alpha) sin(gamma)-cos(alpha) cos(gamma) sin(beta)], [-cos(beta) sin(gamma), sin(beta), cos(beta) cos(gamma)]]

v'が地球座標系XYZでのベクトルvだとすると、初期本体座標系が地球座標系に一致しているので、v'は次のようになります。

v' = Rv v' = [-cos(alpha)sin(gamma)-sin(alpha)sin(beta)cos(gamma); -sin(alpha)sin(gamma)+cos(alpha)sin(beta)cos(gamma); -cos(beta)cos(gamma)]

方位角θは次式で与えられます。

theta = atan((v'_x)/(v'_y)) = atan((-cos(alpha)sin(gamma)-sin(alpha)sin(beta)cos(gamma))/(-sin(alpha)sin(gamma)+cos(alpha)sin(beta)cos(gamma)))

ただし、βとγが両方ゼロでない場合に限ります。

上記の方位角計算は、パラメータが定義済みかつnullでなく、absolute 値を表す場合、次のJavaScriptで表現できます。

var degtorad = Math.PI / 180; // 度→ラジアン変換

function compassHeading( alpha, beta, gamma ) {

  var _x = beta  ? beta  * degtorad : 0; // beta値
  var _y = gamma ? gamma * degtorad : 0; // gamma値
  var _z = alpha ? alpha * degtorad : 0; // alpha値

  var cX = Math.cos( _x );
  var cY = Math.cos( _y );
  var cZ = Math.cos( _z );
  var sX = Math.sin( _x );
  var sY = Math.sin( _y );
  var sZ = Math.sin( _z );

  // Vx, Vy成分を計算
  var Vx = - cZ * sY - sZ * sX * cY;
  var Vy = - sZ * sY + cZ * sX * cY;

  // 方位角を計算
  var compassHeading = Math.atan( Vx / Vy );

  // 方位角を全周で表現
  if( Vy < 0 ) {
    compassHeading += Math.PI;
  } else if( Vx < 0 ) {
    compassHeading += 2 * Math.PI;
  }

  return compassHeading * ( 180 / Math.PI ); // 方位角(度単位)

}

一貫性チェックとして、γ = 0の場合

theta = atan(-sin(alpha)sin(beta)/cos(alpha)sin(beta)) = -alpha

となり、期待通りです。

また、β = 90の場合

theta = atan((-cos(alpha)sin(gamma)-sin(alpha)cos(gamma))/(-sin(alpha)sin(gamma)+cos(alpha)cos(gamma))) theta = atan(-sin(alpha+gamma)/cos(alpha+gamma)) = -(alpha+gamma)

となり、期待通りです。

A.2 デバイスの向きの別表現

このセクションは規範的ではありません。

Tait-Bryan角による向き表現は、ジンバルロック [GIMBALLOCK] のような問題を引き起こすことがあります。用途に応じて、Device Orientation値を他の回転表現に変換すると便利な場合もあります。

最初の代替的な表現は回転行列を使う方法です。上記具体例の成分回転行列を組み合わせることで、デバイス本体座標系の向きを合成回転行列として表現できます。

Rが地球座標系XYZでのデバイスの回転行列だとすると、初期本体座標系が地球座標系に一致しているので、Rは次のようになります。

R = ZXY = [[cos(alpha) cos(gamma)-sin(alpha) sin(beta) sin(gamma), -cos(beta) sin(alpha), cos(gamma) sin(alpha) sin(beta)+cos(alpha) sin(gamma)], [cos(gamma) sin(alpha)+cos(alpha) sin(beta) sin(gamma), cos(alpha) cos(beta), sin(alpha) sin(gamma)-cos(alpha) cos(gamma) sin(beta)], [-cos(beta) sin(gamma), sin(beta), cos(beta) cos(gamma)]]
上記の合成回転行列は、渡されたパラメータが定義済みかつnullでなく、absolute 値を表す場合、以下のJavaScriptで表現できます。
var degtorad = Math.PI / 180; // 度→ラジアン変換

function getRotationMatrix( alpha, beta, gamma ) {

  var _x = beta  ? beta  * degtorad : 0; // beta値
  var _y = gamma ? gamma * degtorad : 0; // gamma値
  var _z = alpha ? alpha * degtorad : 0; // alpha値

  var cX = Math.cos( _x );
  var cY = Math.cos( _y );
  var cZ = Math.cos( _z );
  var sX = Math.sin( _x );
  var sY = Math.sin( _y );
  var sZ = Math.sin( _z );

  //
  // ZXY回転行列の構成
  //

  var m11 = cZ * cY - sZ * sX * sY;
  var m12 = - cX * sZ;
  var m13 = cY * sZ * sX + cZ * sY;

  var m21 = cY * sZ + cZ * sX * sY;
  var m22 = cZ * cX;
  var m23 = sZ * sY - cZ * cY * sX;

  var m31 = - cX * sY;
  var m32 = sX;
  var m33 = cX * cY;

  return [
    m11,    m12,    m13,
    m21,    m22,    m23,
    m31,    m32,    m33
  ];

};

デバイスの向きデータのもう一つの代替表現は、四元数(Quaternion)です。[QUATERNIONS]

qが地球座標系XYZでのデバイスの単位四元数だとすると、初期本体座標系が地球座標系に一致しているので、qは次のようになります。

q = [[q_w], [q_x], [q_y], [q_z]] = [[cos(beta)cos(gamma)cos(alpha) - sin(beta)sin(gamma)sin(alpha)], [sin(beta)cos(gamma)cos(alpha) - cos(beta)sin(gamma)sin(alpha)], [cos(beta)sin(gamma)cos(alpha) + sin(beta)cos(gamma)sin(alpha)], [cos(beta)cos(gamma)sin(alpha) + sin(beta)sin(gamma)cos(alpha)]]
上記の四元数は、渡されたパラメータが定義済みであり、absolute 値かつnullでない場合、以下のJavaScriptで表現できます。
var degtorad = Math.PI / 180; // 度→ラジアン変換

function getQuaternion( alpha, beta, gamma ) {

  var _x = beta  ? beta  * degtorad : 0; // beta値
  var _y = gamma ? gamma * degtorad : 0; // gamma値
  var _z = alpha ? alpha * degtorad : 0; // alpha値

  var cX = Math.cos( _x/2 );
  var cY = Math.cos( _y/2 );
  var cZ = Math.cos( _z/2 );
  var sX = Math.sin( _x/2 );
  var sY = Math.sin( _y/2 );
  var sZ = Math.sin( _z/2 );

  //
  // ZXY四元数の構成
  //

  var w = cX * cY * cZ - sX * sY * sZ;
  var x = sX * cY * cZ - cX * sY * sZ;
  var y = cX * sY * cZ + sX * cY * sZ;
  var z = cX * cY * sZ + sX * sY * cZ;

  return [ w, x, y, z ];

}

ラグランジュの四平方定理を使って、単位四元数が正しく構成されたかを確認できます。

q_w^2 * q_x^2 * q_y^2 * q_z^2 = 1

となり、期待通りです。

謝辞

Device Orientation and Motion仕様は、2016年8月にDeviceOrientation Event Specificationとして候補勧告として初公開され、Geolocation Working Groupによって最初に策定されました。このグループは2017年に終了し、仕様は一時的に廃止されましたが、2019年にDevices and Sensors Working Groupによって再活性化され、相互運用性、テストの自動化、プライバシー、編集面の強化(§ 10 変更点参照)など大幅な改良が行われました。

2024年にはDevices and Sensors Working GroupがWeb Applications Working Groupと連携し、仕様は共同成果物となり、発展を続けています。初期設計の議論はこのGitHubリポジトリには残されていませんが、Geolocation Working Groupのメーリングリストアーカイブで閲覧できます。

W3Cは、Lars Erik Bolstad、Dean Jackson、Claes Nilsson、George Percivall、Doug Turner、Matt Womer、Chris Dumezの貢献に感謝します。

10. 変更点

このセクションでは、レビューの参考となる主な変更点や編集上の改善点をまとめています。詳細はコミットログをご覧ください。 2016-08-18候補勧告以降の変更点:

適合性

文書の慣例

適合性要件は、記述的な主張とRFC 2119の用語を組み合わせて表現されます。 この文書の規範部分で使われているキーワード「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」はRFC 2119の定義通りに解釈してください。 ただし、読みやすさのため、この仕様書ではこれらの単語は全て大文字では記載されていません。

この仕様書の本文は、明示的に非規範的と記載されているセクション、例、および注記を除き、すべて規範的です。[RFC2119]

この仕様書の例は、「for example」という語で始まるか、または規範文からclass="example"で区別されて示されます。 例:

これは参考例(informative example)の一例です。

参考注記(informative notes)は「Note」で始まり、class="note"で規範文から区別されます。 例:

Note: これは参考注記です。

適合アルゴリズム

アルゴリズムの一部として命令形で記述された要件(例:「先頭の空白文字を除去する」「falseを返してこれらの手順を中断する」など)は、アルゴリズムの導入部で使われているキーワード(must, should, mayなど)の意味で解釈してください。

アルゴリズムや具体的な手順として表現された適合性要件は、最終的な結果が同等であれば、どんな方法で実装しても構いません。 特に、この仕様書で定義されているアルゴリズムは理解しやすいことを目的としており、必ずしも高性能なものではありません。 実装者は最適化を推奨します。

索引

本仕様で定義されている用語

参照によって定義される用語

参考文献

規範的参考文献

[ACCELEROMETER]
Anssi Kostiainen. 加速度計. 2025年2月12日. CRD. URL: https://www.w3.org/TR/accelerometer/
[DOM]
Anne van Kesteren. DOM現行標準. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript言語仕様. URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron. 汎用センサーAPI. 2024年2月22日. CRD. URL: https://www.w3.org/TR/generic-sensor/
[HTML]
Anne van Kesteren; 他. HTML現行標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra現行標準. 現行標準. URL: https://infra.spec.whatwg.org/
[ORIENTATION-SENSOR]
Kenneth Christiansen; Anssi Kostiainen. オリエンテーションセンサー. 2024年1月10日. WD. URL: https://www.w3.org/TR/orientation-sensor/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. 権限. 2024年12月20日. WD. URL: https://www.w3.org/TR/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. 2025年2月10日. WD. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
S. Bradner. RFCにおける要件レベルを示すキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[W3C-PROCESS]
Elika J. Etemad (fantasai); Florian Rivoal. W3Cプロセス文書. 2023年11月3日. URL: https://www.w3.org/policies/process/
[WEBDRIVER2]
Simon Stewart; David Burns. WebDriver. 2025年2月10日. WD. URL: https://www.w3.org/TR/webdriver2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL現行標準. 現行標準. URL: https://webidl.spec.whatwg.org/

参考情報

[CSS-TRANSFORMS-2]
Tab Atkins Jr.; 他. CSS Transforms Module Level 2. 2021年11月9日. WD. URL: https://www.w3.org/TR/css-transforms-2/
[EULERANGLES]
オイラー角. URL: https://en.wikipedia.org/wiki/Euler_angles
[FINGERPRINT]
センサーフィンガープリントによるモバイルデバイス識別. 2014年8月6日. URL: https://arxiv.org/abs/1408.1416
[G-FORCE]
G-フォース. URL: https://en.wikipedia.org/wiki/G-force
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1. 2018年12月4日. CR. URL: https://www.w3.org/TR/geometry-1/
[GIMBALLOCK]
ジンバルロック. URL: https://en.wikipedia.org/wiki/Gimbal_Lock
[GYROSCOPE]
Anssi Kostiainen. ジャイロスコープ. 2024年10月8日. CRD. URL: https://www.w3.org/TR/gyroscope/
[INDOORPOS]
Shala, Ubejd; Angel Rodriguez. Androidデバイスにおけるセンサーフュージョンによる屋内位置推定. 2011年. URL: http://www.diva-portal.org/smash/record.jsf?pid=diva2%3A475619&dswid=9050
[MOTION-SENSORS]
Kenneth Christiansen; Alexander Shalamov. Motion Sensors Explainer. 2017年8月30日. NOTE. URL: https://www.w3.org/TR/motion-sensors/
[PROPERACCELERATION]
固有加速度. URL: https://en.wikipedia.org/wiki/Proper_acceleration
[QUATERNIONS]
四元数. URL: https://en.wikipedia.org/wiki/Quaternion
[SCREEN-ORIENTATION]
Marcos Caceres. スクリーンオリエンテーション. 2023年8月9日. WD. URL: https://www.w3.org/TR/screen-orientation/
[SENSORID]
Zhang, Jiexin; Beresford, Alastair R.; Sheret, Ian. SensorID: スマートフォンのセンサ較正フィンガープリント. 2019年. URL: https://doi.org/10.1109/SP.2019.00072
[TOUCH]
TouchSignatures: JavaScriptを用いたモバイルセンサデータに基づくユーザータッチ動作とPINの識別. 2016年2月12日. URL: https://arxiv.org/abs/1602.04115

IDL索引

partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientation;
};

[Exposed=Window, SecureContext]
interface DeviceOrientationEvent : Event {
    constructor(DOMString type, optional DeviceOrientationEventInit eventInitDict = {});
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
    readonly attribute boolean absolute;

    static Promise<PermissionState> requestPermission(optional boolean absolute = false);
};

dictionary DeviceOrientationEventInit : EventInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
    boolean absolute = false;
};

partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientationabsolute;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEventAcceleration {
    readonly attribute double? x;
    readonly attribute double? y;
    readonly attribute double? z;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEventRotationRate {
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
};

partial interface Window {
    [SecureContext] attribute EventHandler ondevicemotion;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEvent : Event {
    constructor(DOMString type, optional DeviceMotionEventInit eventInitDict = {});
    readonly attribute DeviceMotionEventAcceleration? acceleration;
    readonly attribute DeviceMotionEventAcceleration? accelerationIncludingGravity;
    readonly attribute DeviceMotionEventRotationRate? rotationRate;
    readonly attribute double interval;

    static Promise<PermissionState> requestPermission();
};

dictionary DeviceMotionEventAccelerationInit {
    double? x = null;
    double? y = null;
    double? z = null;
};

dictionary DeviceMotionEventRotationRateInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
};

dictionary DeviceMotionEventInit : EventInit {
    DeviceMotionEventAccelerationInit acceleration;
    DeviceMotionEventAccelerationInit accelerationIncludingGravity;
    DeviceMotionEventRotationRateInit rotationRate;
    double interval = 0;
};

MDN

DeviceMotionEvent/DeviceMotionEvent

Firefox29+SafariNoneChrome59+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEvent/acceleration

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEvent/accelerationIncludingGravity

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEvent/interval

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEvent/rotationRate

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEvent

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Window/devicemotion_event

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventAcceleration/x

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventAcceleration/y

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventAcceleration/z

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventAcceleration

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventRotationRate/alpha

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventRotationRate/beta

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventRotationRate/gamma

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceMotionEventRotationRate

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent/DeviceOrientationEvent

Firefox17+SafariNoneChrome59+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent/absolute

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent/alpha

In all current engines.

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent/beta

In all current engines.

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent/gamma

In all current engines.

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent

In all current engines.

Firefox6+SafariNoneChrome7+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet1.0+Opera Mobile14+

Window/deviceorientation_event

In all current engines.

Firefox6+SafariNoneChrome7+
Opera12+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

Window/devicemotion_event

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Window/deviceorientation_event

In all current engines.

Firefox6+SafariNoneChrome7+
Opera12+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

Window/deviceorientationabsolute_event

In only one current engine.

FirefoxNoneSafariNoneChrome50+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?