WebXR ヒットテストモジュール

W3C 作業草案,

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2025/WD-webxr-hit-test-1-20251211/
最新公開バージョン:
https://www.w3.org/TR/webxr-hit-test-1/
編集者草案:
https://immersive-web.github.io/hit-test/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/webxr-hit-test-1/
フィードバック:
GitHub
仕様内インライン
編集者:
(Google)
元編集者:
(Google)
参加:
課題を提出 (未解決の課題)
メーリングリストのアーカイブ
W3C の #immersive-web IRC

概要

WebXR Device API とともに使用するために、実世界ジオメトリに対してヒットテストを実行する方法を説明します。

この文書のステータス

このセクションは、その公開時点におけるこの文書のステータスを説明します。現在の W3C 公開物の一覧と、この 技術報告書の最新リビジョンは、W3C 標準および草案索引で確認できます。

Immersive Web Working Group は、グループがまだ対処していない すべてのバグ 報告の一覧を管理しています。この草案は、ワーキンググループでまだ議論されるべき保留中の課題の一部を強調しています。これらの課題の結果については、 それらが妥当であるかどうかも含め、まだ決定されていません。 未解決の課題に対する仕様テキスト案を含むプルリクエストを強く推奨します。

この文書は、Immersive Web Working Group によって、勧告 トラックを用いて作業草案として公開されました。この文書は W3C 勧告になることを意図しています。

作業草案としての公開は、 W3C およびそのメンバーによる支持を意味するものではありません。これは草案文書であり、いつでも他の文書によって 更新、置換、または廃止される可能性があります。この文書を作業中のもの以外として引用することは不適切です。

この文書は、 W3C Patent Policy の下で運営されるグループによって作成されました。 W3C は、そのグループの成果物に関連して行われた特許 開示の公開一覧を管理しています。そのページには、 特許を開示するための手順も含まれています。個人が、 Essential Claim(s) を含むとその個人が信じる特許について実際の知識を持っている場合、その個人は W3C Patent Policy の セクション 6 に従ってその情報を開示しなければなりません。

この文書は、2025年8月18日 W3C Process Document によって管理されます。

1. 導入

このモジュールは、WebXR アプリケーションがユーザーの実世界 環境へレイを投射し、XR デバイスが知る限りにおいて、そのレイが 物理オブジェクトと交差した点と、交差した面の向きを報告できるようにする仕組みを説明します。これにより、 床にオブジェクトを現実的に置いたり、壁に取り付けたりするなど、それらの面に合わせて 仮想オブジェクトを配置できます。ヒットテスト API は、WebXR Device API への拡張であり、WebXR Augmented Reality Module の上に構築されます。

1.1. 用語

この文書で理解されるヒットテストとは、理想化された数学的なレイ (半直線)が、基盤となる Augmented Reality ハードウェアおよび ソフトウェアによって理解される実世界と交差するかどうかを確認する行為です。API を利用するアプリケーションによって作成された 仮想オブジェクトに対するレイの交差は、ヒットテスト API の範囲外であることが明示されています。

2. 初期化

2.1. 機能記述子

アプリケーションがセッション中にヒットテストを実行する関心を示すためには、 適切な 機能 記述子を指定してセッションを要求しなければなりません。文字列 hit-test は、ヒットテスト 機能の新しい有効な機能記述子として、このモジュールによって導入されます。

デバイスが ネイティブヒットテスト 能力を公開している場合、そのデバイスはヒットテスト機能をサポートできるものとされます。inline XR device は、ヒットテスト機能をサポート できるものとして扱ってはなりません。

ヒットテスト機能は feature policy の対象であり、要求元文書のオリジンで "xr-spatial-tracking" ポリシーが許可されている必要があります。

3. ヒットテストオプション

3.1. XRHitTestTrackableType

XRHitTestTrackableType 列挙型は、ヒットテストソース作成の目的で使用できるエンティティの型を指定します。

enum XRHitTestTrackableType {
  "point",
  "plane",
  "mesh"
};

3.2. XRHitTestOptionsInit

XRHitTestOptionsInit 辞書は、実行されるヒットテストの挙動に影響する構成可能な値の集合を表します。

dictionary XRHitTestOptionsInit {
  required XRSpace space;
  sequence<XRHitTestTrackableType> entityTypes;
  XRRay offsetRay;
};

space 辞書メンバーは、 offsetRay がそれに相対して指定される XRSpace を指定します。

entityTypes 辞書メンバーは、 ヒットテストの結果を計算するために使用される XRHitTestTrackableTypes の配列を指定します。

offsetRay 辞書メンバーは、 ヒットテストの実行に使用される XRRay を指定します。 offsetRay は、space によって定義される座標系で表現されているものとして解釈されます。

XRHitTestOptionsInit 辞書には、関連付けられた 有効な entityTypes があり、これは辞書の構築時に提供された場合は entityTypes に設定されます。entityTypes が構築時に提供されなかった場合、有効な entityTypes は、単一の要素 "plane" を含む配列に設定されます。

XRHitTestOptionsInit 辞書には、関連付けられた 有効な offsetRay があり、これは辞書の構築時に提供された場合は offsetRay に設定されます。offsetRay が構築時に提供されなかった場合、有効な offsetRay は、 パラメーターなしで XRRay() を呼び出すことによって構築された XRRay に設定されます。

3.3. XRTransientInputHitTestOptionsInit

XRTransientInputHitTestOptionsInit 辞書は、実行される一時的入力のヒットテストの挙動に影響する構成可能な値の集合を表します。

dictionary XRTransientInputHitTestOptionsInit {
  required DOMString profile;
  sequence<XRHitTestTrackableType> entityTypes;
  XRRay offsetRay;
};

profile 辞書メンバーは、 ヒットテスト結果を計算するために使用される一時的入力ソースの入力プロファイル名を指定します。

entityTypes 辞書メンバーは、 ヒットテストの結果を計算するために使用される XRHitTestTrackableTypes の配列を指定します。

offsetRay 辞書メンバーは、 ヒットテストの実行に使用される XRRay を指定します。 offsetRay は、一時的入力ソースのヒットテスト結果を計算するときに、渡された profile と一致するプロファイルを持つ XRInputSource によって定義される座標系で表現されているものとして解釈されます。

XRTransientInputHitTestOptionsInit 辞書には、関連付けられた 有効な entityTypes があり、これは 辞書の構築時に提供された場合は entityTypes に設定されます。entityTypes が構築時に提供されなかった場合、有効な entityTypes は、 単一の要素 "plane" を含む配列に設定されます。

XRTransientInputHitTestOptionsInit 辞書には、関連付けられた 有効な offsetRay があり、これは辞書の構築時に提供された場合は offsetRay に設定されます。offsetRay が構築時に提供されなかった場合、有効な offsetRay は、 パラメーターなしで XRRay() を呼び出すことによって構築された XRRay に設定されます。

4. ヒットテストソース

4.1. XRHitTestSource

[SecureContext, Exposed=Window]
interface XRHitTestSource {
  undefined cancel();
};

XRHitTestSource オブジェクトは、ヒットテストへの有効なサブスクリプションへのハンドルとして機能します。

XRHitTestSource には、ヒットテストソースの作成に使用された XRSession を格納する、関連付けられた session があります。

XRHitTestSource には、ヒット テストを要求するために使用された XRSpacenative origin を識別するのに十分な情報を格納する、 関連付けられた native origin があります。この情報は、ヒットテスト結果を計算するときに その後使用されます。

XRHitTestSource には、関連付けられた entity types があります。これは、ヒットテスト結果を計算するときに考慮される エンティティ型を記述する XRHitTestTrackableTypes の配列です。

XRHitTestSource には、ヒットテスト結果を計算するときに使用される XRRay である、 関連付けられた offset ray があります。

XRHitTestSource は、それが session有効なヒットテストソースの集合に存在する限り、 active とみなされます。

sessionspaceentityTypesoffsetRay から ヒットテストソースを作成するために、ユーザーエージェントは次の 手順を実行しなければなりません。

  1. hitTestSource を新しい XRHitTestSource とします。

  2. hitTestSourcesessionsession に初期化します。

  3. hitTestSourcenative origin を、spacenative origin に初期化します。

  4. hitTestSourceentity typesentityTypes に初期化します。

  5. offsetRayspace から transformedOffsetRay を計算します。これは、 spacenative origin 座標系で解釈されたときに、 spaceeffective origin 座標系で解釈された offsetRay と同じレイを表すようにします。

  6. hitTestSourceoffset raytransformedOffsetRay に初期化します。

  7. hitTestSource を返します。

cancel() メソッドは、XRHitTestSource hitTestSource 上で呼び出されたとき、アプリケーションが指定された hitTestSource の ヒットテスト結果の取得にもはや関心がないことを通知します。

cancel() メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行することにより ヒットテストソースをキャンセルしなければなりません。

  1. hitTestSourceactive でない場合、InvalidStateError を投げ、これらの手順を中止します。

  2. hitTestSourcesession有効なヒットテストソースの集合から削除します。

アプリケーションが特定の XRHitTestSource hitTestSource への参照をもはや保持していない場合、ユーザーエージェントは、 hitTestSource がまだ active であれば、 ヒットテストソースをキャンセルしてもよいです。キャンセルは 未指定の時点で発生してもよく(またはまったく発生しなくてもよく)、アプリケーションはクリーンアップのためにこの 挙動に依存するべきではありません。

4.2. XRTransientInputHitTestSource

[SecureContext, Exposed=Window]
interface XRTransientInputHitTestSource {
  undefined cancel();
};

XRTransientInputHitTestSource オブジェクトは、一時的入力ソースのヒットテストへの有効なサブスクリプションへのハンドルとして機能します。

XRTransientInputHitTestSource には、ヒットテストソースの作成に使用された XRSession を格納する、関連付けられた session があります。

XRTransientInputHitTestSource には、入力ソースの入力プロファイル名を格納する、関連付けられた profile があります。この 情報は、一時的入力ソースのヒットテスト結果を計算するときにその後使用されます。

XRTransientInputHitTestSource には、関連付けられた entity types があります。これは、 ヒットテスト結果を計算するときに考慮されるエンティティ型を記述する XRHitTestTrackableTypes の配列です。

XRTransientInputHitTestSource には、ヒットテスト結果を計算するときに使用される XRRay である、 関連付けられた offset ray があります。

XRTransientInputHitTestSource は、それが session一時的入力用の有効なヒットテストソースの 集合に存在する限り、active とみなされます。

sessionprofileentityTypesoffsetRay から 一時的入力用のヒットテストソースを作成する ために、ユーザー エージェントは次の手順を実行しなければなりません。

  1. hitTestSource を新しい XRTransientInputHitTestSource とします。

  2. hitTestSourcesessionsession に初期化します。

  3. hitTestSourceprofileprofile に初期化します。

  4. hitTestSourceentity typesentityTypes に初期化します。

  5. hitTestSourceoffset rayoffsetRay に初期化します。

  6. hitTestSource を返します。

cancel() メソッドは、 XRTransientInputHitTestSource hitTestSource 上で呼び出されたとき、アプリケーションが指定された hitTestSource の ヒットテスト結果の取得にもはや関心がないことを通知します。

cancel() メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行することにより 一時的入力用のヒットテストソースをキャンセル しなければなりません。

  1. hitTestSourceactive でない場合、InvalidStateError を投げ、これらの手順を中止します。

  2. hitTestSourcesession一時的入力用の有効なヒット テストソースの集合から削除します。

アプリケーションが特定の XRTransientInputHitTestSource hitTestSource への参照をもはや保持していない場合、ユーザーエージェントは、 hitTestSource がまだ active であれば、一時的 入力用のヒットテストソースをキャンセルしてもよいです。キャンセルは 未指定の時点で発生してもよく(またはまったく発生しなくてもよく)、アプリケーションはクリーンアップのためにこの 挙動に依存するべきではありません。

5. ヒットテスト結果

5.1. XRHitTestResult

[SecureContext, Exposed=Window]
interface XRHitTestResult {
  XRPose? getPose(XRSpace baseSpace);
};

XRHitTestResult は、ヒットテストの単一の結果を含みます。これは、ヒットテストを実行するために使用されたレイと、 基盤となる XR デバイスによって理解される ユーザーの環境との交点に関する情報をカプセル化します。

XRHitTestResult には、関連付けられた frame があります。これは、結果が計算された XRFrame です。

XRHitTestResult には、関連付けられた native origin があります。この native origin は、 その Y 軸が交点における面の法線ベクトルを表す新しい座標系を定義します。

XRFrame frameXRHitTestTrackableType の配列 entityTypes、および native hit test result nativeResult が与えられたとき、 ヒットテスト結果を作成するために、ユーザー エージェントは次の手順を実行しなければなりません。

  1. hitTestResult を新しい XRHitTestResult とします。

  2. sessionframesession とします。

  3. devicesessionXR device とします。

  4. nativeResultnative entity typenativeEntityType について device に問い合わせます。

  5. native entity type から変換し、 nativeEntityTypeentityType にします。

  6. entityTypenull であるか、entityTypes 配列に存在しない場合、 null を返し、これらの手順を中止します。

  7. hitTestResultframeframe に設定します。

  8. hitTestResultnative origin を、 nativeResult から取得された native origin に設定します。

  9. hitTestResult を返します。

getPose(baseSpace) メソッドは、XRHitTestResult hitTestResult 上で baseSpace パラメーターとともに呼び出されたとき、 baseSpace に相対する hitTestResult のポーズを、frame によって表される時点における XRPose として提供します。

getPose(baseSpace) メソッドが hitTestResult 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. framehitTestResultframe とします。

  2. frameactive ブール値が false である場合、InvalidStateError を投げ、これらの手順を中止します。

  3. pose を新しい XRPose とします。

  4. space を新しい XRSpace とし、native originnative origin に、origin offsetidentity transform に、そして sessionframe の session に設定します。

  5. frame によって表される時点で、baseSpace における space のポーズを pose取り込みます

  6. pose を返します。

5.2. XRTransientInputHitTestResult

[SecureContext, Exposed=Window]
interface XRTransientInputHitTestResult {
  [SameObject] readonly attribute XRInputSource inputSource;
  readonly attribute FrozenArray<XRHitTestResult> results;
};

XRTransientInputHitTestResult は、一時的入力のヒットテスト結果の配列を含み、XRInputSource inputSource によってグループ化されます。

inputSource 属性は、results 配列を計算するために使用された XRInputSource を含みます。

results 属性は、計算された XRHitTestResult の配列を含みます。

XRTransientInputHitTestResult には、関連付けられた frame があります。これは、結果が計算された XRFrame です。

XRInputSource inputSourceXRFrame frameXRHitTestTrackableType の配列 entityTypes、および native hit test results の配列 nativeResults が与えられたとき、 一時的入力用のヒットテスト結果を作成する ために、ユーザーエージェントは次の手順を実行しなければなりません。

  1. hitTestResult を新しい XRTransientInputHitTestResult とします。

  2. hitTestResultframeframe に設定します。

  3. hitTestResultinputSourceinputSource に設定します。

  4. resultsXRHitTestResult の空配列とします。

  5. nativeResults 内の各 nativeResult について:

    1. frameentityTypes、および nativeResult から ヒットテスト結果を作成し、 result とします。

    2. resultnull の場合、 nativeResults 内の次の項目へ進みます。

    3. resultresults 配列に追加します。

  6. hitTestResultresultsresults に設定します。

  7. hitTestResult を返します。

6. ヒットテストの要求

partial interface XRSession {
  Promise<XRHitTestSource> requestHitTestSource(XRHitTestOptionsInit options);
  Promise<XRTransientInputHitTestSource> requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit options);
};

XRSession は、ヒットテスト結果を計算するときに使用される、関連付けられた 有効なヒットテストソースの集合を 含むように拡張されます。

XRSession は、一時的入力のヒットテスト結果を計算するときに使用される、関連付けられた 一時的入力用の有効なヒットテスト ソースの集合を含むように拡張されます。

有効なヒットテストソースまたは最近行われた要求の総数が、API の正当な使用としては多すぎると 判断される場合、アプリケーションは 不合理な数の要求を行っているとみなされます。 これは、濫用を避けるためにユーザーエージェントが採用してもよい任意のプライバシー対策です。

アプリケーションは、XRSessionrequestHitTestSource() メソッドを使用して、ヒット テストを要求できます。

requestHitTestSource(options) メソッドは、XRSession session 上で呼び出されたとき、次の手順を実行しなければなりません。

  1. promise新しい Promise とします。

  2. hit-test 機能記述子が session有効化された機能のリスト含まれていない場合、promiseNotSupportedError却下し、これらの手順を中止します。

  3. sessionended 値が true である場合、InvalidStateError を投げ、これらの手順を中止します。

  4. ユーザーエージェントは、不合理な数の要求がある場合、promiseNotAllowedError却下し、これらの手順を中止してもよいです。

  5. すべてのヒットテスト結果を計算するアルゴリズムが sessionフレーム更新のリストにまだ存在しない場合は、 それを追加します。

  6. sessionoptionsspaceoptions有効な entityTypes、および options有効な offsetRay を用いて、 ヒットテストソースを作成し、 hitTestSource とします。

  7. hitTestSourcenull である場合、promiseOperationError却下し、 これらの手順を中止します。

  8. 作成された hitTestSourcesession有効なヒットテストソースの集合に格納します。

  9. promise を、作成された hitTestSource解決します。

requestHitTestSourceForTransientInput(options) メソッドは、XRSession session 上で呼び出されたとき、次の手順を実行しなければなりません。

  1. promise新しい Promise とします。

  2. hit-test 機能 記述子が session有効化された機能のリスト含まれていない場合、promiseNotSupportedError却下し、これらの手順を中止します。

  3. sessionended 値が true である場合、InvalidStateError を投げ、これらの手順を中止します。

  4. ユーザーエージェントは、不合理な数の要求がある場合、promiseNotAllowedError却下し、これらの手順を中止してもよいです。

  5. すべてのヒットテスト結果を計算するアルゴリズムが sessionフレーム更新のリストにまだ存在しない場合は、 それを追加します。

  6. sessionoptionsprofileoptions有効な entityTypes、および options有効な offsetRay を用いて、 一時的入力用のヒットテストソースを 作成し、hitTestSource とします。

  7. hitTestSourcenull である場合、promiseOperationError却下し、 これらの手順を中止します。

  8. 作成された hitTestSourcesession一時的入力用の有効なヒット テストソースの集合に格納します。

  9. promise を、作成された hitTestSource解決します。

7. ヒットテスト結果の計算

与えられた XRFrame frame について、すべてのヒットテスト結果を計算するために、ユーザーエージェントは次の手順を 実行しなければなりません。

  1. frame を用いて ヒットテスト結果を計算するアルゴリズムを呼び出します。

  2. frame を用いて 一時的入力のヒットテスト結果を 計算するアルゴリズムを呼び出します。

与えられた XRFrame frame について、session有効なヒットテストソースの集合に存在する各ヒットテストソース hitTestSource について、ヒットテスト結果を計算するために、ユーザー エージェントは次の手順を実行しなければなりません。

  1. entityTypeshitTestSourceentity types とします。

  2. sessionframesession とします。

  3. devicesessionXR device とします。

  4. hitTestSourcenative origin の最新の coordinates を、device のトラッキングシステムに問い合わせます。

  5. hitTestSourceoffset rayoffsetRaycoordinates に相対して表現されているものとして解釈し、その解釈を使用して native hit test を実行し、native hit test results nativeResults を取得します。

  6. hitTestResults を空の リストとします。

  7. nativeResults 内の各 native hit test result nativeResult について、 次の手順を実行します。

    1. frameentityTypes、および nativeResult から ヒットテスト結果を作成し、 hitTestResult とします。

    2. hitTestResultnull である場合、 nativeResults 内の次の項目へ進みます。

    3. hitTestResults が、offsetRay から nativeResult までの レイに沿った距離でソートされたままになるように、 hitTestResulthitTestResults に追加します。

  8. hitTestResults を、frameヒットテストソースから ヒットテスト結果へのマップに、hitTestSource キーの下で格納します。

与えられた XRFrame frame について、session一時的入力用の有効なヒットテスト ソースの集合に存在する各ヒットテストソース hitTestSource について、 一時的入力のヒットテスト結果を計算する ために、ユーザーエージェントは次の手順を実行しなければなりません。

  1. entityTypeshitTestSourceentity types とします。

  2. sessionframesession とします。

  3. devicesessionXR device とします。

  4. candidateInputSources を、有効な XR 入力ソースのリストに含まれる session のすべての入力ソースのうち、一時的とみなされるものの集合とします。

  5. matchingInputSources を、 candidateInputSources に含まれるすべての入力ソースのうち、その profiles 配列が、hitTestSourceprofile と等しい項目を含むものの集合とします。

  6. hitTestResults を XRTransientInputHitTestResults の空配列とします。

  7. matchingInputSources 内の各一時的入力ソース inputSource について:

    1. inputSourcetargetRaySpacenative origin の最新の coordinates を、device のトラッキングシステムに問い合わせます。

    2. hitTestSourceoffset ray を、 coordinates に相対して表現されているものとして解釈し、その解釈を使用して native hit test を実行し、native hit test results nativeResults を取得します。

    3. frameinputSourceentityTypes、および nativeResults から 一時的入力用のヒットテスト結果を 作成し、hitTestResult とします。

    4. hitTestResulthitTestResults 配列に追加します。

  8. hitTestResults を、frame一時的入力用の ヒットテストソースからヒットテスト結果へのマップに、 hitTestSource キーの下で格納します。

8. ヒットテスト結果の取得

partial interface XRFrame {
  sequence<XRHitTestResult> getHitTestResults(XRHitTestSource hitTestSource);
  sequence<XRTransientInputHitTestResult> getHitTestResultsForTransientInput(XRTransientInputHitTestSource hitTestSource);
};

XRFrame は、XRHitTestSource から XRHitTestResults の配列へのマッピングを格納する、関連付けられた ヒットテストソースからヒット テスト結果へのマップを含むように拡張されます。

XRFrame は、XRTransientInputHitTestSource から XRTransientInputHitTestResults の配列へのマッピングを格納する、 関連付けられた 一時的入力用のヒット テストソースからヒットテスト結果へのマップを含むように拡張されます。

アプリケーションは、XRFramegetHitTestResults() メソッドを使用して、XRHitTestSource からヒットテスト結果を取得できます。

getHitTestResults(hitTestSource) メソッドが XRFrame frame 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. frameactive ブール値が false の場合、InvalidStateError を投げ、これらの手順を中止します。

  2. hitTestSource の項目が frameヒットテストソースから ヒットテスト結果へのマップに存在することを確認します。項目が存在しない場合、InvalidStateError を投げ、これらの手順を中止します。

  3. frameヒットテストソースから ヒットテスト結果へのマップ内で hitTestSource の項目を検索し、 それを results に代入します。

  4. results を返します。

アプリケーションは、XRFramegetHitTestResultsForTransientInput() メソッドを使用して、XRTransientInputHitTestSource から一時的入力のヒットテスト結果を取得できます。

getHitTestResultsForTransientInput(hitTestSource) メソッドが XRFrame frame 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. frameactive ブール値が false の場合、InvalidStateError を投げ、これらの手順を中止します。

  2. hitTestSource の項目が frame一時的入力用の ヒットテストソースからヒットテスト結果へのマップに存在することを確認します。項目が存在しない場合、 InvalidStateError を投げ、これらの手順を中止します。

  3. frame一時的入力用の ヒットテストソースからヒットテスト結果へのマップ内で hitTestSource の項目を検索し、 それを results に代入します。

  4. results を返します。

9. 幾何プリミティブ

9.1. XRRayDirectionInit

XRRayDirectionInit 辞書は、XRRay(origin, direction) コンストラクターに渡される方向ベクトルを表します。

dictionary XRRayDirectionInit {
  double x = 0;
  double y = 0;
  double z = -1;
  double w = 0;
};

9.2. XRRay

XRRay は、 origin 点と direction ベクトルによって記述される幾何学的なレイです。

XRRay は、 matrix である matrix を含みます。

[SecureContext, Exposed=Window]
interface XRRay {
  constructor(optional DOMPointInit origin = {}, optional XRRayDirectionInit direction = {});
  constructor(XRRigidTransform transform);
  [SameObject] readonly attribute DOMPointReadOnly origin;
  [SameObject] readonly attribute DOMPointReadOnly direction;
  [SameObject] readonly attribute Float32Array matrix;
};

XRRay(origin, direction) コンストラクターは、 呼び出されたときに次の手順を実行しなければなりません。

  1. ray を新しい XRRay とします。

  2. rayorigin{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 } に初期化します。

  3. raydirection{ x: 0.0, y: 0.0, z: -1.0, w: 0.0 } に初期化します。

  4. directionxy、 および z がすべてゼロである場合、TypeError を投げ、これらの手順を中止します。

  5. directionw が 0.0 でない場合、TypeError を投げ、これらの手順を中止します。

  6. originw が 1.0 でない場合、TypeError を投げ、これらの手順を中止します。

  7. rayoriginx 値を originx に、 y 値を originy に、 そして z 値を originz に初期化します。

  8. raydirectionx 値を directionx に、 y 値を directiony に、 そして z 値を directionz に初期化します。

  9. raydirectionxy、 および z 成分を正規化します。

  10. raymatrixnull に初期化します。

  11. ray を返します。

XRRay(transform) コンストラクターは、 呼び出されたときに次の手順を実行しなければなりません。

  1. ray を新しい XRRay とします。

  2. rayorigin{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 } に初期化します。

  3. raydirection{ x: 0.0, y: 0.0, z: -1.0, w: 0.0 } に初期化します。

  4. transformmatrix を左から前乗算することにより、rayorigin を変換し、ray をその結果に設定します。

  5. transformmatrix を左から前乗算することにより、raydirection を変換し、ray をその結果に設定します。

  6. raydirectionxy、 および z 成分を正規化します。

  7. raymatrixnull に初期化します。

  8. ray を返します。

origin 属性は、レイがそこから発生する空間内の 3 次元点を メートル単位で定義します。originw 属性は 1.0 でなければなりません。

direction 属性は、レイの 3 次元方向ベクトルを定義します。 directionw 属性は 0.0 でなければならず、ベクトルは長さが 1.0 になるように正規化されていなければなりません。

matrix 属性は、XRRay に沿ってオブジェクトを配置するために 使用できる変換を表す matrix です。これは、 [0, 0, 0] から発生し負の Z 軸方向へ延びるレイから、XRRayorigin および direction によって記述されるレイへの変換です。そのような行列は、direction および Z 軸に垂直な任意のベクトルを不変にする回転成分を持つものでなければなりません。 この属性は、XRRay行列を取得することによって 計算されなければなりません。この属性は遅延評価されるべきです。

注: XRRaymatrix は、レンダリング時にレイのグラフィカルな表現を容易に配置するために使用できます。

与えられた XRRay ray について、その行列を取得するには

  1. raymatrixnull でない場合、次の手順を実行します。

    1. matrix に対する IsDetachedBuffer 操作が false の場合、raymatrix を返します。

  2. z をベクトル [0, 0, -1] とします。

  3. axiszraydirection の ベクトル外積、z × direction とします。

  4. cos_anglezraydirection の スカラー内積、z · direction とします。

  5. 次に基づいて rotation を設定します。

    cos_angle が -1 より大きく 1 より小さい場合
    rotation を、axis の周りで arccos(cos_angle) だけ右手系の平面回転を表す 回転行列に設定します。
    それ以外で、cos_angle が -1 の場合
    rotation を、ベクトル [1, 0, 0] の周りで arccos(cos_angle) だけ右手系の平面回転を表す回転行列に設定します。
    それ以外の場合
    rotation を単位行列に設定します。
  6. translation を、rayorigin に対応する成分を持つ平行移動行列とします。

  7. matrix を、列ベクトル表記において rotation を左から translation に前乗算した結果(すなわち translation * rotation)とします。

  8. raymatrixmatrix に設定します。

  9. matrix を返します。

XRRay ray から任意のエンティティ entity までの レイに沿った距離 distance は、 ray.origin + ray.direction * distance がエンティティ entity に属する点となり、distance が非負であり、かつ上記の述語が なお成立するより小さい distance の値が存在しないように定義されます。 「エンティティに属する点」の意味を定義するのは XR device に委ねられます。

10. ネイティブデバイス概念

ヒットテスト API を実装するユーザーエージェントは、基盤となる XR デバイスからユーザーの環境に関する情報を 取得する方法を持っていなければなりません。このセクションは、デバイスのネイティブ能力に関連する要件と概念を 説明しようとするものであり、さまざまな基盤フレームワーク/デバイスのための十分な余地を残すため、 必然的に十分に未指定です。

10.1. ネイティブヒットテスト

この仕様では、XR device が、次の要件を満たす native hit test を実行する方法をユーザーエージェントに公開すると仮定します。

注: ヒットテスト 機能をネイティブに公開しないデバイスについても、XR デバイスによって公開され得るユーザーの環境に関する情報を取得する他の方法を活用することで、ユーザーエージェントが この仕様を実装できる可能性があります。

10.2. ネイティブエンティティ型

Native hit test results returned by XR device should contain information about the type of the entity used to compute the result. Such native types might consist of, but not be limited to:

native entity type から変換するには、XRHitTestTrackableType へ、ユーザーエージェントは次の手順を実行しなければなりません。

  1. nativeEntityType を変換される native entity type とします。

  2. entityType を新しい XRHitTestTrackableType とします。

  3. entityType を次のように初期化します。

    nativeEntityType"point" に対応する型を含む場合
    entityType"point" に設定します。
    それ以外で、nativeEntityType"plane" に対応する型を含む場合
    entityType"plane" に設定します。
    それ以外で、nativeEntityType"mesh" に対応する型を含む場合
    entityType"mesh" に設定します。
    それ以外の場合
    entityTypenull に設定します
  4. entityType を返します。

10.3. ネイティブヒットテスト結果

XR デバイスから返される Native hit test results は、 ユーザーの環境との交点の位置を含むべきです。ネイティブエンティティ型と XR デバイスが利用可能な情報によっては、 その結果は、交点におけるユーザーの環境の面法線をユーザーエージェントが計算できるように定義された向きも 含むべきです。

交点の位置および向きに関する情報は、native hit test result の native origin に含まれるべきです。Native origin は、その Y 軸が交点における 面の法線ベクトルを表すような新しい座標系を定義します。向きが XR デバイスから返されない場合、ユーザーエージェントは、 それが定義する座標系の Y 軸が上向き(負の重力ベクトル方向)を指すように native origin を設定するべきです。

異なる実装および異なる AR フレームワーク間の 互換性を維持するために、ヒットテスト結果の native origin によって定義される座標系の他の軸を指定する必要があるかどうかを 決定します。

11. プライバシーとセキュリティに関する考慮事項

ヒットテスト API は、複数の方向にヒットテストレイを送信することで、ユーザー環境を多かれ少なかれ 精密にマッピングするために使用できます。ヒットテストは、XR セッションを作成するときに 機能 記述子として宣言されなければならず、これによりユーザーエージェントは、ウェブサイトによる ヒットテスト API の使用を許可することの潜在的なプライバシー上の影響をユーザーに通知できます。 さらに、ユーザーエージェントは、真にプライバシー侵害的でない用途としては不合理な 数の要求が行われたと判断した場合、ヒットテスト要求を拒否することが許可されます。

変更点

2021年8月31日の最初の公開作業 草案からの変更点

12. 謝辞

次の個人が WebXR Hit Test 仕様の設計に貢献しました。

適合性

文書 規約

適合性要件は、 記述的な表明と RFC 2119 の用語を組み合わせて表現されます。 この文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、RFC 2119 で説明されているように解釈されるものとします。 ただし、読みやすさのため、 この仕様では、これらの語はすべて大文字では表記されません。

この仕様のすべてのテキストは、 非規範として明示的に印が付けられたセクション、例、および注を除き、規範的です。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 または規範的テキストから class="example" によって区別されます。 たとえば、次のようになります。

これは参考例の一例です。

参考注記は “Note” という語で始まり、 規範的テキストから class="note" によって区別されます。 たとえば、次のようになります。

注、これは参考注記です。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現される要件 (たとえば "strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されるキーワード ("must", "should", "may" など)の意味で解釈されます。

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

索引

この仕様によって定義される 用語

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

参考文献

規範参考文献

[ECMASCRIPT]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1. 2018年12月4日. CR. URL: https://www.w3.org/TR/geometry-1/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC において要件レベルを示すために用いる キーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. 2025年10月1日. CRD. URL: https://www.w3.org/TR/webxr/

IDL 索引

enum XRHitTestTrackableType {
  "point",
  "plane",
  "mesh"
};

dictionary XRHitTestOptionsInit {
  required XRSpace space;
  sequence<XRHitTestTrackableType> entityTypes;
  XRRay offsetRay;
};

dictionary XRTransientInputHitTestOptionsInit {
  required DOMString profile;
  sequence<XRHitTestTrackableType> entityTypes;
  XRRay offsetRay;
};

[SecureContext, Exposed=Window]
interface XRHitTestSource {
  undefined cancel();
};

[SecureContext, Exposed=Window]
interface XRTransientInputHitTestSource {
  undefined cancel();
};

[SecureContext, Exposed=Window]
interface XRHitTestResult {
  XRPose? getPose(XRSpace baseSpace);
};

[SecureContext, Exposed=Window]
interface XRTransientInputHitTestResult {
  [SameObject] readonly attribute XRInputSource inputSource;
  readonly attribute FrozenArray<XRHitTestResult> results;
};

partial interface XRSession {
  Promise<XRHitTestSource> requestHitTestSource(XRHitTestOptionsInit options);
  Promise<XRTransientInputHitTestSource> requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit options);
};

partial interface XRFrame {
  sequence<XRHitTestResult> getHitTestResults(XRHitTestSource hitTestSource);
  sequence<XRTransientInputHitTestResult> getHitTestResultsForTransientInput(XRTransientInputHitTestSource hitTestSource);
};

dictionary XRRayDirectionInit {
  double x = 0;
  double y = 0;
  double z = -1;
  double w = 0;
};

[SecureContext, Exposed=Window]
interface XRRay {
  constructor(optional DOMPointInit origin = {}, optional XRRayDirectionInit direction = {});
  constructor(XRRigidTransform transform);
  [SameObject] readonly attribute DOMPointReadOnly origin;
  [SameObject] readonly attribute DOMPointReadOnly direction;
  [SameObject] readonly attribute Float32Array matrix;
};

課題索引

ヒットテスト結果の native origin によって定義される座標系の他の軸を指定する必要があるかどうかを 決定します。これは、異なる実装および異なる AR フレームワーク間の互換性を維持するためです。
MDN

XRFrame/getHitTestResults

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRFrame/getHitTestResultsForTransientInput

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRHitTestResult/getPose

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRHitTestResult

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRHitTestSource/cancel

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRHitTestSource

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRRay/XRRay

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRRay/direction

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRRay/matrix

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRRay/origin

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRRay

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRSession/requestHitTestSource

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet12.1+Opera Mobile?
MDN

XRSession/requestHitTestSourceForTransientInput

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRTransientInputHitTestResult/inputSource

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRTransientInputHitTestResult/results

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRTransientInputHitTestResult

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRTransientInputHitTestSource/cancel

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRTransientInputHitTestSource

In only one current engine.

FirefoxNoneSafariNoneChrome81+
Opera?Edge81+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?