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" };
-
型
"point"のヒットテスト追跡可能要素は、 ヒットテスト結果が、基盤となる Augmented Reality システムによって検出された特徴点に基づいて計算されることを示します。 -
型
"plane"のヒットテスト追跡可能要素は、 ヒットテスト結果が、基盤となる Augmented Reality システムによって検出された平面に基づいて計算されることを示します。 -
型
"mesh"のヒットテスト追跡可能要素は、 ヒットテスト結果が、基盤となる Augmented Reality システムによって検出されたメッシュに基づいて計算されることを示します。
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
には、ヒット
テストを要求するために使用された
XRSpace
の native origin を識別するのに十分な情報を格納する、
関連付けられた native origin があります。この情報は、ヒットテスト結果を計算するときに
その後使用されます。
XRHitTestSource
には、関連付けられた entity types があります。これは、ヒットテスト結果を計算するときに考慮される
エンティティ型を記述する XRHitTestTrackableTypes の配列です。
各 XRHitTestSource
には、ヒットテスト結果を計算するときに使用される XRRay である、
関連付けられた offset ray があります。
XRHitTestSource
は、それが session の有効なヒットテストソースの集合に存在する限り、
active とみなされます。
session、space、entityTypes、offsetRay から ヒットテストソースを作成するために、ユーザーエージェントは次の 手順を実行しなければなりません。
-
hitTestSource を新しい
XRHitTestSourceとします。 -
hitTestSource の session を session に初期化します。
-
hitTestSource の native origin を、space の native origin に初期化します。
-
hitTestSource の entity types を entityTypes に初期化します。
-
offsetRay と space から transformedOffsetRay を計算します。これは、 space の native origin 座標系で解釈されたときに、 space の effective origin 座標系で解釈された offsetRay と同じレイを表すようにします。
-
hitTestSource の offset ray を transformedOffsetRay に初期化します。
-
hitTestSource を返します。
cancel() メソッドは、XRHitTestSource
hitTestSource 上で呼び出されたとき、アプリケーションが指定された hitTestSource の
ヒットテスト結果の取得にもはや関心がないことを通知します。
cancel()
メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行することにより
ヒットテストソースをキャンセルしなければなりません。
-
hitTestSource が active でない場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
hitTestSource を session の有効なヒットテストソースの集合から削除します。
アプリケーションが特定の 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 とみなされます。
session、profile、entityTypes、offsetRay から 一時的入力用のヒットテストソースを作成する ために、ユーザー エージェントは次の手順を実行しなければなりません。
-
hitTestSource を新しい
XRTransientInputHitTestSourceとします。 -
hitTestSource の session を session に初期化します。
-
hitTestSource の profile を profile に初期化します。
-
hitTestSource の entity types を entityTypes に初期化します。
-
hitTestSource の offset ray を offsetRay に初期化します。
-
hitTestSource を返します。
cancel() メソッドは、
XRTransientInputHitTestSource
hitTestSource 上で呼び出されたとき、アプリケーションが指定された hitTestSource の
ヒットテスト結果の取得にもはや関心がないことを通知します。
cancel()
メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行することにより
一時的入力用のヒットテストソースをキャンセル
しなければなりません。
-
hitTestSource が active でない場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
hitTestSource を session の一時的入力用の有効なヒット テストソースの集合から削除します。
アプリケーションが特定の 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
frame、XRHitTestTrackableType
の配列 entityTypes、および native hit test result nativeResult が与えられたとき、
ヒットテスト結果を作成するために、ユーザー
エージェントは次の手順を実行しなければなりません。
-
hitTestResult を新しい
XRHitTestResultとします。 -
session を frame の session とします。
-
device を session の XR device とします。
-
nativeResult の native entity type、nativeEntityType について device に問い合わせます。
-
native entity type から変換し、 nativeEntityType を entityType にします。
-
entityType が
nullであるか、entityTypes 配列に存在しない場合、nullを返し、これらの手順を中止します。 -
hitTestResult の frame を frame に設定します。
-
hitTestResult の native origin を、 nativeResult から取得された native origin に設定します。
-
hitTestResult を返します。
getPose(baseSpace)
メソッドは、XRHitTestResult
hitTestResult 上で baseSpace パラメーターとともに呼び出されたとき、
baseSpace に相対する hitTestResult のポーズを、frame によって表される時点における XRPose
として提供します。
getPose(baseSpace) メソッドが
hitTestResult 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。
-
frame を hitTestResult の frame とします。
-
frame の active ブール値が
falseである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
pose を新しい
XRPoseとします。 -
space を新しい
XRSpaceとし、native origin は native origin に、origin offset は identity transform に、そして session は frame の session に設定します。 -
frame によって表される時点で、baseSpace における space のポーズを pose に取り込みます。
-
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
inputSource、XRFrame
frame、XRHitTestTrackableType
の配列 entityTypes、および native hit test results の配列 nativeResults
が与えられたとき、
一時的入力用のヒットテスト結果を作成する
ために、ユーザーエージェントは次の手順を実行しなければなりません。
-
hitTestResult を新しい
XRTransientInputHitTestResultとします。 -
hitTestResult の frame を frame に設定します。
-
hitTestResult の
inputSourceを inputSource に設定します。 -
results を
XRHitTestResultの空配列とします。 -
nativeResults 内の各 nativeResult について:
-
frame、entityTypes、および nativeResult から ヒットテスト結果を作成し、 result とします。
-
result が
nullの場合、 nativeResults 内の次の項目へ進みます。 -
result を results 配列に追加します。
-
-
hitTestResult の
resultsを results に設定します。 -
hitTestResult を返します。
6. ヒットテストの要求
partial interface XRSession {Promise <XRHitTestSource >requestHitTestSource (XRHitTestOptionsInit );options Promise <XRTransientInputHitTestSource >requestHitTestSourceForTransientInput (XRTransientInputHitTestOptionsInit ); };options
XRSession
は、ヒットテスト結果を計算するときに使用される、関連付けられた 有効なヒットテストソースの集合を
含むように拡張されます。
XRSession
は、一時的入力のヒットテスト結果を計算するときに使用される、関連付けられた 一時的入力用の有効なヒットテスト
ソースの集合を含むように拡張されます。
有効なヒットテストソースまたは最近行われた要求の総数が、API の正当な使用としては多すぎると 判断される場合、アプリケーションは 不合理な数の要求を行っているとみなされます。 これは、濫用を避けるためにユーザーエージェントが採用してもよい任意のプライバシー対策です。
アプリケーションは、XRSession
の
requestHitTestSource()
メソッドを使用して、ヒット
テストを要求できます。
requestHitTestSource(options)
メソッドは、XRSession
session 上で呼び出されたとき、次の手順を実行しなければなりません。
-
promise を 新しい Promise とします。
-
hit-test 機能記述子が session の 有効化された機能のリストに含まれていない場合、promise を
NotSupportedErrorで却下し、これらの手順を中止します。 -
session の
ended値がtrueである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
ユーザーエージェントは、不合理な数の要求がある場合、promise を
NotAllowedErrorで却下し、これらの手順を中止してもよいです。 -
すべてのヒットテスト結果を計算するアルゴリズムが session の フレーム更新のリストにまだ存在しない場合は、 それを追加します。
-
session、options の
space、 options の 有効な entityTypes、および options の 有効な offsetRay を用いて、 ヒットテストソースを作成し、 hitTestSource とします。 -
hitTestSource が
nullである場合、promise をOperationErrorで却下し、 これらの手順を中止します。 -
作成された hitTestSource を session の 有効なヒットテストソースの集合に格納します。
-
promise を、作成された hitTestSource で解決します。
requestHitTestSourceForTransientInput(options)
メソッドは、XRSession
session 上で呼び出されたとき、次の手順を実行しなければなりません。
-
promise を 新しい Promise とします。
-
hit-test 機能 記述子が session の 有効化された機能のリストに含まれていない場合、promise を
NotSupportedErrorで却下し、これらの手順を中止します。 -
session の
ended値がtrueである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
ユーザーエージェントは、不合理な数の要求がある場合、promise を
NotAllowedErrorで却下し、これらの手順を中止してもよいです。 -
すべてのヒットテスト結果を計算するアルゴリズムが session の フレーム更新のリストにまだ存在しない場合は、 それを追加します。
-
session、options の
profile、 options の 有効な entityTypes、および options の 有効な offsetRay を用いて、 一時的入力用のヒットテストソースを 作成し、hitTestSource とします。 -
hitTestSource が
nullである場合、promise をOperationErrorで却下し、 これらの手順を中止します。 -
作成された hitTestSource を session の 一時的入力用の有効なヒット テストソースの集合に格納します。
-
promise を、作成された hitTestSource で解決します。
7. ヒットテスト結果の計算
与えられた XRFrame
frame について、すべてのヒットテスト結果を計算するために、ユーザーエージェントは次の手順を
実行しなければなりません。
-
frame を用いて ヒットテスト結果を計算するアルゴリズムを呼び出します。
-
frame を用いて 一時的入力のヒットテスト結果を 計算するアルゴリズムを呼び出します。
与えられた XRFrame
frame について、session
の
有効なヒットテストソースの集合に存在する各ヒットテストソース
hitTestSource について、ヒットテスト結果を計算するために、ユーザー
エージェントは次の手順を実行しなければなりません。
-
entityTypes を hitTestSource の entity types とします。
-
session を frame の
sessionとします。 -
device を session の XR device とします。
-
hitTestSource の native origin の最新の coordinates を、device のトラッキングシステムに問い合わせます。
-
hitTestSource の offset ray、offsetRay を coordinates に相対して表現されているものとして解釈し、その解釈を使用して native hit test を実行し、native hit test results nativeResults を取得します。
-
hitTestResults を空の リストとします。
-
nativeResults 内の各 native hit test result nativeResult について、 次の手順を実行します。
-
frame、entityTypes、および nativeResult から ヒットテスト結果を作成し、 hitTestResult とします。
-
hitTestResult が
nullである場合、 nativeResults 内の次の項目へ進みます。 -
hitTestResults が、offsetRay から nativeResult までの レイに沿った距離でソートされたままになるように、 hitTestResult を hitTestResults に追加します。
-
-
hitTestResults を、frame の ヒットテストソースから ヒットテスト結果へのマップに、hitTestSource キーの下で格納します。
与えられた XRFrame
frame について、session
の
一時的入力用の有効なヒットテスト
ソースの集合に存在する各ヒットテストソース hitTestSource について、
一時的入力のヒットテスト結果を計算する
ために、ユーザーエージェントは次の手順を実行しなければなりません。
-
entityTypes を hitTestSource の entity types とします。
-
session を frame の
sessionとします。 -
device を session の XR device とします。
-
candidateInputSources を、有効な XR 入力ソースのリストに含まれる session のすべての入力ソースのうち、一時的とみなされるものの集合とします。
-
matchingInputSources を、 candidateInputSources に含まれるすべての入力ソースのうち、その
profiles配列が、hitTestSource の profile と等しい項目を含むものの集合とします。 -
hitTestResults を XRTransientInputHitTestResults の空配列とします。
-
matchingInputSources 内の各一時的入力ソース inputSource について:
-
inputSource の
targetRaySpaceの native origin の最新の coordinates を、device のトラッキングシステムに問い合わせます。 -
hitTestSource の offset ray を、 coordinates に相対して表現されているものとして解釈し、その解釈を使用して native hit test を実行し、native hit test results nativeResults を取得します。
-
frame、inputSource、 entityTypes、および nativeResults から 一時的入力用のヒットテスト結果を 作成し、hitTestResult とします。
-
hitTestResult を hitTestResults 配列に追加します。
-
-
hitTestResults を、frame の 一時的入力用の ヒットテストソースからヒットテスト結果へのマップに、 hitTestSource キーの下で格納します。
8. ヒットテスト結果の取得
partial interface XRFrame {sequence <XRHitTestResult >getHitTestResults (XRHitTestSource );hitTestSource sequence <XRTransientInputHitTestResult >getHitTestResultsForTransientInput (XRTransientInputHitTestSource ); };hitTestSource
XRFrame
は、XRHitTestSource
から XRHitTestResults の配列へのマッピングを格納する、関連付けられた
ヒットテストソースからヒット
テスト結果へのマップを含むように拡張されます。
XRFrame
は、XRTransientInputHitTestSource
から XRTransientInputHitTestResults の配列へのマッピングを格納する、
関連付けられた 一時的入力用のヒット
テストソースからヒットテスト結果へのマップを含むように拡張されます。
アプリケーションは、XRFrame
の
getHitTestResults()
メソッドを使用して、XRHitTestSource
からヒットテスト結果を取得できます。
getHitTestResults(hitTestSource)
メソッドが XRFrame
frame 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。
-
frame の active ブール値が
falseの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
hitTestSource の項目が frame の ヒットテストソースから ヒットテスト結果へのマップに存在することを確認します。項目が存在しない場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
frame の ヒットテストソースから ヒットテスト結果へのマップ内で hitTestSource の項目を検索し、 それを results に代入します。
-
results を返します。
アプリケーションは、XRFrame
の
getHitTestResultsForTransientInput()
メソッドを使用して、XRTransientInputHitTestSource
から一時的入力のヒットテスト結果を取得できます。
getHitTestResultsForTransientInput(hitTestSource)
メソッドが XRFrame
frame 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。
-
frame の active ブール値が
falseの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
hitTestSource の項目が frame の 一時的入力用の ヒットテストソースからヒットテスト結果へのマップに存在することを確認します。項目が存在しない場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
frame の 一時的入力用の ヒットテストソースからヒットテスト結果へのマップ内で hitTestSource の項目を検索し、 それを results に代入します。
-
results を返します。
9. 幾何プリミティブ
9.1. XRRayDirectionInit
XRRayDirectionInit
辞書は、XRRay(origin, direction)
コンストラクターに渡される方向ベクトルを表します。
dictionary {XRRayDirectionInit double = 0;x double = 0;y double = -1;z double = 0; };w
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) コンストラクターは、
呼び出されたときに次の手順を実行しなければなりません。
-
ray を新しい
XRRayとします。 -
ray の
originを{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }に初期化します。 -
ray の
directionを{ x: 0.0, y: 0.0, z: -1.0, w: 0.0 }に初期化します。 -
direction の
x、y、 およびzがすべてゼロである場合、TypeErrorを投げ、これらの手順を中止します。 -
ray の
originのx値を origin のxに、y値を origin のyに、 そしてz値を origin のzに初期化します。 -
ray の
directionのx値を direction のxに、y値を direction のyに、 そしてz値を direction のzに初期化します。 -
ray の matrix を
nullに初期化します。 -
ray を返します。
XRRay(transform) コンストラクターは、
呼び出されたときに次の手順を実行しなければなりません。
-
ray を新しい
XRRayとします。 -
ray の
originを{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }に初期化します。 -
ray の
directionを{ x: 0.0, y: 0.0, z: -1.0, w: 0.0 }に初期化します。 -
transform の
matrixを左から前乗算することにより、ray のoriginを変換し、ray をその結果に設定します。 -
transform の
matrixを左から前乗算することにより、ray のdirectionを変換し、ray をその結果に設定します。 -
ray の matrix を
nullに初期化します。 -
ray を返します。
origin 属性は、レイがそこから発生する空間内の 3 次元点を
メートル単位で定義します。origin
の
w
属性は 1.0 でなければなりません。
direction 属性は、レイの 3 次元方向ベクトルを定義します。
direction
の
w
属性は 0.0 でなければならず、ベクトルは長さが 1.0 になるように正規化されていなければなりません。
matrix 属性は、XRRay
に沿ってオブジェクトを配置するために
使用できる変換を表す matrix です。これは、
[0, 0, 0] から発生し負の Z 軸方向へ延びるレイから、XRRay の origin
および direction
によって記述されるレイへの変換です。そのような行列は、direction
および Z 軸に垂直な任意のベクトルを不変にする回転成分を持つものでなければなりません。
この属性は、XRRay
の行列を取得することによって
計算されなければなりません。この属性は遅延評価されるべきです。
注: XRRay の matrix
は、レンダリング時にレイのグラフィカルな表現を容易に配置するために使用できます。
与えられた XRRay
ray について、その行列を取得するには
-
ray の matrix が
nullでない場合、次の手順を実行します。-
matrix に対する
IsDetachedBuffer操作がfalseの場合、ray の matrix を返します。
-
-
z をベクトル
[0, 0, -1]とします。 -
axis を z と ray の
directionの ベクトル外積、z × directionとします。 -
cos_angle を z と ray の
directionの スカラー内積、z · directionとします。 -
次に基づいて rotation を設定します。
- cos_angle が -1 より大きく 1 より小さい場合
- rotation を、axis の周りで
arccos(cos_angle)だけ右手系の平面回転を表す 回転行列に設定します。 - それ以外で、cos_angle が -1 の場合
- rotation を、ベクトル
[1, 0, 0]の周りでarccos(cos_angle)だけ右手系の平面回転を表す回転行列に設定します。 - それ以外の場合
- rotation を単位行列に設定します。
-
translation を、ray の
originに対応する成分を持つ平行移動行列とします。 -
matrix を、列ベクトル表記において rotation を左から translation に前乗算した結果(すなわち
translation * rotation)とします。 -
ray の matrix を matrix に設定します。
-
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 を実行する方法をユーザーエージェントに公開すると仮定します。
-
ユーザーの環境に対してテストされる 3D レイを受け入れます。
-
渡されたレイとユーザーの環境との交点を表す 3D ポーズのコレクションを返します。 コレクション内の各項目には、そのネイティブ結果を得るために使用された ネイティブエンティティの型に関する情報と、ユーザー エージェントが交点におけるユーザーの環境の面法線を計算できるようにするのに十分な情報も含まれているべきです。
注: ヒットテスト 機能をネイティブに公開しないデバイスについても、XR デバイスによって公開され得るユーザーの環境に関する情報を取得する他の方法を活用することで、ユーザーエージェントが この仕様を実装できる可能性があります。
10.2. ネイティブエンティティ型
-
Point - ヒットテスト結果が、ユーザーの環境で見つかった特徴点に基づいて計算されたことを示します。
-
Plane - ヒットテスト結果が、ユーザーの環境で検出された平面に基づいて計算されたことを示します。
-
Mesh - ヒットテスト結果が、ユーザーの環境で検出されたメッシュに基づいて計算されたことを示します。
native entity type から変換するには、XRHitTestTrackableType
へ、ユーザーエージェントは次の手順を実行しなければなりません。
-
nativeEntityType を変換される native entity type とします。
-
entityType を新しい
XRHitTestTrackableTypeとします。 -
entityType を次のように初期化します。
-
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 仕様の設計に貢献しました。