1. はじめに
WebXR Anchors モジュールは、基盤となる XR システムに対して、世界に対するシステムの理解が 変化するにつれて、特定の三次元ポーズ(位置および向き)の変化を追跡するよう アプリケーションが要求できるようにする。これにより、アプリケーションは、シーン内に配置した 仮想オブジェクトの位置を調整でき、配置されたオブジェクトが本当に ユーザーの環境内に存在しているという錯覚を維持しやすくなる。
1.1. 用語
この文書で理解される Pose は、3D 空間内の位置および向きを意味する。
この文書で理解される Anchor は、現実世界に対して固定されたポーズを追跡し、 アプリケーションによって作成されるエンティティである。
2. 初期化
2.1. 機能記述子
アプリケーションがセッション中にアンカーを使用する関心を示すには、適切な 機能記述子を用いてセッションを要求しなければならない。 文字列 anchors は、このモジュールによって、アンカー機能の 新しい有効な機能記述子として導入される。
デバイスの追跡システムがネイティブアンカー機能を公開する場合、そのデバイスは
アンカー機能をサポート可能である。インライン XR
デバイスは、アンカー機能をサポート可能として
扱ってはならない。ユーザーエージェントは、mode が "immersive-ar"
に等しい
セッションについて、アンカー機能のサポートを試みるべきである。
注記: アンカー機能のサポートは必須ではないが、
アンカーは、AR 対応アプリケーションが良好なユーザー
体験を提供するために必要な基本機能の 1 つである。したがって、ユーザーエージェントが
"immersive-ar" セッションでアンカーをサポートすることが *強く*
推奨される。
3. アンカー
3.1. XRAnchor
[SecureContext ,Exposed =Window ]interface {XRAnchor readonly attribute XRSpace ;anchorSpace Promise <DOMString >();requestPersistentHandle undefined (); };delete
XRAnchor は、
他の XRSpaces
に対して相対的にアンカーを特定するために使用できる
anchorSpace
を含む。この属性が、deleted が
true に設定されているときにアクセスされた場合、ユーザーエージェントは
InvalidStateError
を投げなければならない。
各 XRAnchor
には、初期値が false に設定される、関連付けられた deleted ブール値がある。
各 XRAnchor
には、関連付けられた native origin がある。
各 XRAnchor
には、関連付けられた session がある。
-
anchor を、新しい
XRAnchorとする。 -
anchor の native origin を native origin に設定する。
-
anchor の session を session に設定する。
-
anchor の deleted を
falseに設定する。 -
anchor の
anchorSpaceを、anchor の session に設定された session と、native origin に設定された native origin を用いて作成された、新しいXRSpaceオブジェクトに設定する。 -
anchor を返す。
requestPersistentHandle()
メソッドは、XRAnchor
anchor 上で呼び出されたとき、次の手順を実行しなければならない:
-
promise を、この
XRSystemの関連するレルム内の新しい Promise とする。 -
anchor の deleted が
trueの場合、promise をInvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
session を anchor の session とする。
-
session の map of persistent anchors が値 anchor を含む場合、次の手順を実行する:
-
uuid を、 session の map of persistent anchors 上の anchor 値のマッピングのキーとする。
-
promise を uuid で解決する。
-
promise を返す。
-
これらの手順を中止する。
-
-
uuid を空文字列とする。
-
UUID [RFC9562] を文字列として生成し、 uuid に追加する。
-
uuid および anchor を、session の map of persistent anchors に追加する。
-
promise を uuid で解決する。
-
promise を返す。
注記: XRSystem
が一意な ID を作成する場合、それは一意であり、現在のオリジンにのみ知られていなければならない。
4. アンカーの作成
XRSession
は、関連付けられた set of tracked anchors を含むように拡張される。
XRSession
は、UUID 文字列をキーとし、XRAnchor
にマップする、関連付けられた map of persistent
anchors を含むように拡張される。
このマップは、XR
device によって作成および保存され、origin 上の任意の
XRSession
によって作成され、まだ破棄されていない永続アンカーの集合のみに制限される。
このマップのサイズはユーザーエージェントによって決定される。ユーザーエージェントは任意の理由で
このマップからエントリを削除してもよい。たとえば、すべてのオリジンに対するすべてのマップで
システムアンカーの最大数に達した場合、ユーザーエージェントは新しく
要求されたアンカーのための空き領域を作るためにエントリを解放してもよい。
XRSession
は、XRAnchor
オブジェクトをキーとし、
オブジェクトにマップする、関連付けられた map of new anchors を含むように拡張される。
Promise<XRAnchor>
partial interface XRFrame {Promise <XRAnchor >(createAnchor XRRigidTransform ,pose XRSpace ); };space partial interface XRSession {readonly attribute FrozenArray <DOMString >;persistentAnchors Promise <XRAnchor >(restorePersistentAnchor DOMString );uuid Promise <undefined >(deletePersistentAnchor DOMString ); };uuid partial interface XRHitTestResult {Promise <XRAnchor >(); };createAnchor
XRHitTestResult
は、関連付けられた native entity を含むように拡張される。
結果を計算することになった native entity に関する情報を基盤となるシステムが提供しない場合、
native entity は null に設定されていると仮定される。
アプリケーションは、次の 2 つの方法のいずれかでアンカーを作成できる:
-
フレームからアンカーを作成することによって - 作成されたアンカーは、 特定の現実世界のオブジェクトには付加されない。
-
ヒットテスト結果からアンカーを作成することによって - 基盤となる XR device がそれをサポートしている場合、 作成されたアンカーは現実世界のオブジェクトに付加される。
フレームからアンカーを作成するには、アプリケーションは XRFrame
の
createAnchor(pose, space)
メソッドを呼び出すことができる。
createAnchor(pose, space)
メソッドは、XRFrame
frame 上で pose および space とともに呼び出されたとき、次の手順を実行しなければならない:
-
promise を新しい Promise とする。
-
frame の active ブール値が
falseの場合、promise をInvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
session を frame の session とする。
-
update anchors アルゴリズムがまだ存在しない場合、それを session の list of frame updates に追加する。
-
device を session の XR device とする。
-
effective origin を space の effective origin とする。
-
anchor native origin を、device が pose を用いて新しいアンカーを作成する呼び出しから 返された新しい native origin とする。この pose は、 frame の time において effective origin に対して相対的に表現されたものとして解釈される。
-
anchor native origin および session を用いて、新しい anchor オブジェクトを作成する anchor。
-
anchor を session の set of tracked anchors に追加する。
-
anchor から promise へのマッピングを session の map of new anchors に追加する。
-
promise を返す。
注記: 各 createAnchor(pose, space)
呼び出しによって返されるアンカーが追跡する物理的な原点が、メソッドが呼び出されたフレームによって表される時点で、
space 内の pose の物理的位置と可能な限り近く整合することを確実にするのは、ユーザーエージェントの責任である。
具体的には、これは、動的に変化する空間について、ユーザーエージェントがアプリの指定した時刻におけるそのような空間の native origin を
捕捉しようとするべきであることを意味する。このテキストは非規範的であるが、仕様の著者および
コントリビューターの意図を表しているため、異なるベンダー間で一貫した動作を確保するために、
実装が従うことが強く推奨される。
persistentAnchors
は、既知の永続アンカーのリストを返す。このリストは、map of persistent anchors のキーを反映しなければならない。
restorePersistentAnchor(uuid)
メソッドは、XRSession
session 上で uuid とともに呼び出されたとき、次の手順を実行しなければならない:
-
promise を、この
XRSystemの関連するレルム内の新しい Promise とする。 -
session の map of persistent anchors が uuid から
XRAnchorへのマッピングを含まない場合、 promise をInvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
session の
ended値が `true` の場合、promise をInvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
anchor を、session の map of persistent anchors 上の uuid からのマッピングの値とする。
-
session の map of new anchors が anchor から promise へのマッピングを含む場合、 promise を
InvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
session の map of new anchors がユーザーエージェントの 最大サイズに達している場合、promise を
InvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
anchor を session の set of tracked anchors に追加する。
-
anchor から promise へのマッピングを session の map of new anchors に追加する。
-
promise を返す。
deletePersistentAnchor()
メソッドは、XRSession
session 上で uuid とともに呼び出されたとき、次の手順を実行しなければならない:
-
promise を、この
XRSystemの関連するレルム内の新しい Promise とする。 -
session の map of persistent anchors が anchor へのマッピングを含まない場合、promise を
InvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
anchor を、session の map of persistent anchors 上の uuid からのマッピングの値とする。
-
session の map of persistent anchors からマッピングを削除する。
-
anchor 上で
delete()を呼び出す。 -
promise を返す。
ヒットテスト結果からアンカーを作成するには、アプリケーションは
XRHitTestResult
の
createAnchor()
メソッドを呼び出すことができる。
createAnchor()
メソッドは、XRHitTestResult
hitTestResult 上で呼び出されたとき、次の手順を実行しなければならない:
-
promise を新しい Promise とする。
-
frame を hitTestResult の frame とする。
-
frame の active ブール値が
falseの場合、promise をInvalidStateErrorで却下し、 promise を返し、これらの手順を中止する。 -
session を frame の session とする。
-
update anchors アルゴリズムがまだ存在しない場合、それを session の list of frame updates に追加する。
-
device を session の XR device とする。
-
nativeEntity を hitTestResult の native entity とする。
-
anchor native origin を、device が hitTestResult の native origin に位置し、frame の time において nativeEntity にattached された新しいアンカーを作成する呼び出しから返された、 新しい native origin とする。
-
anchor native origin および session を用いて、新しい anchor オブジェクトを作成する anchor。
-
anchor を session の set of tracked anchors に追加する。
-
anchor から promise へのマッピングを session の map of new anchors に追加する。
-
promise を返す。
注記: createAnchor(pose, space)
メソッドに存在する同じ注意事項が、ここにも同様に適用される。
Session の "list of frame updates" には順序を指定する方法が必要になる可能性がある - 一部のアルゴリズムは他のものに依存する場合がある。
5. アンカーの更新
[Exposed =Window ]interface {XRAnchorSet readonly setlike <XRAnchor >; };partial interface XRFrame { [SameObject ]readonly attribute XRAnchorSet ; };trackedAnchors
XRAnchorSet
インターフェイスは、アンカーのコレクションを公開する方法として導入される。
XRFrame
は、フレーム内でまだ追跡されているすべてのアンカーを含む
trackedAnchors
属性を含むように拡張される。XRFrame
の作成時、その集合は最初は空であり、update
anchors アルゴリズムによって設定される。
-
session を frame の session とする。
-
device を session の XR device とする。
-
session の set of tracked anchors 内の各 anchor について、次を実行する:
-
anchor の native origin 情報について、device の追跡システムに問い合わせる。
-
device の追跡システムが anchor をもはやtracks しない場合、次の手順を実行する:
-
anchor を session の set of tracked anchors から削除する。
-
session の map of new anchors が anchor から promise へのマッピングを含む場合、promise を却下し、そのマッピングを削除する。
-
session の set of tracked anchors 内の次のエントリに 続行する。
-
-
anchor を frame の
trackedAnchors集合に追加する。 -
session の map of new anchors が anchor から promise へのマッピングを含む場合、 promise を anchor で解決し、そのマッピングを削除する。
-
6. アンカーの削除
アプリケーションがアンカーへの更新を受け取ることにもはや関心がない場合、delete()
を呼び出すことで、
アンカーを削除できる。
delete()
メソッドは、XRAnchor
anchor 上で呼び出されたとき、次の手順を実行することで
アンカーを削除するものとする:
-
anchor の deleted が
trueの場合、これらの手順を中止する。 -
anchor の
anchorSpaceをnullに設定する。 -
anchor の deleted を
trueに設定する。 -
session を anchor の session とする。
-
device を session の XR device とする。
-
native origin を anchor の native origin とする。
-
native origin をもはや追跡しないことを device の追跡システムに通知する。
-
anchor を session の set of tracked anchors から削除する。
7. ネイティブデバイスの概念
ユーザーエージェントが anchors API を実装できるようにするには、基盤となる XR デバイスが この機能のネイティブサポートを提供するべきである。この節では、基盤となる XR システムに課される要件を説明し、さまざまなフレームワーク / デバイス上で anchors API を 実装できるようにするため、必要上、不完全に規定されている。
7.1. ネイティブアンカー
基盤となる XR device は、アンカーに関連する次の機能をサポートしている場合、 サポート可能な anchors 機能を持つ:
-
ネイティブアンカーの作成が可能であり、次の要件を満たす:
-
ネイティブアンカー API は、アンカーのポーズを現実世界に対して固定されているかのように 維持しようとする。
-
ある特定の時刻
tにおける、新しく作成されるアンカーのポーズを受け入れる。 -
新しく作成されるアンカーを与えられたエンティティに付加する意図を表現するために、 任意で native entity 情報を受け入れる。基盤となる XR システムがアンカーを native entity に付加することをサポートしない場合(すなわち native entity を受け入れない場合)、 新しく作成されたアンカーは自由浮遊になる。
-
ユーザーエージェントによって native origin として扱うことができる 結果を返す。
-
-
ネイティブアンカーは、基盤となる XR システムによって継続的に追跡され、通常はその最新状態を問い合わせることができる。ただし、その位置が不明な フレームが存在する場合があり、そのためユーザーエージェントは、一時的にポーズが特定不能であると報告してもよい。 基盤となるシステムが、ネイティブアンカーの位置が二度と知られることはないと判断した場合、 ネイティブアンカーはもはや追跡されていないと報告するべきである。
-
任意で、ネイティブアンカーは native entity に付加できる。native entity に付加されたネイティブアンカーは、 付加されているエンティティに対してその位置を固定したまま維持しようとする(自由浮遊アンカーの場合の 現実世界に対する固定とは対照的である)。デバイスが、アンカーが付加されているオブジェクトのポーズが 変化したことを検出すると、アンカーはそれに応じて更新される。これは、オブジェクト自体が移動したことを 意味しない - その位置に対するシステムの理解が変化した可能性がある。基盤となるシステムが移動する オブジェクトを追跡できる場合、移動するオブジェクトに付加されたネイティブアンカーも更新されるべきである。
基盤となるデバイスがネイティブアンカーをサポートしない場合、ユーザーエージェントは
エミュレートされたネイティブアンカーを通じて anchors API を実装することを決定してもよい。
このアプローチでは、アンカーは作成されると、そのポーズは決して変化せず、そのポーズは、XRFrame
の
createAnchor(pose, space)
や XRHitTestResult
の
createAnchor()
などのアンカー作成メソッドにアプリケーションが渡したポーズであると仮定する。
注記: エミュレートされたネイティブアンカー
のアプローチは、アプリケーションが anchors 機能を自分自身でエミュレートすることと等価であり、
アプリケーションが処理する必要のあるさまざまな場合の数を減らすのに役立つ場合がある。また、
アプリケーションが "immersive-ar"
および "immersive-vr"
セッションで同じコードを再利用できるようにする可能性もある。
8. プライバシーとセキュリティに関する考慮事項
anchors API は、ユーザー環境に関する情報へのアクセスを直接公開しない。 セッションが hit-test サポートを 有効にして作成され、デバイスが移動するオブジェクトの追跡をサポートする場合、アプリケーションは、 たとえば持ち運ばれているオブジェクトのアンカーポーズの変化を観察することによって、 ユーザー環境のレイアウトを推測できる可能性がある。これは、 hit-testing API と同程度のユーザー環境に関する情報を提供する。アンカー機能は XR セッションを 作成するときに宣言されなければならず、これによりユーザーエージェントは anchors API の使用を ウェブサイトに許可することの潜在的なプライバシー上の影響についてユーザーに通知できる。
一般的な移動するオブジェクトの追跡を サポートするデバイスを認識していない - それらは仕様でまったく考慮されるべきだろうか?そのようなデバイスの 例はあるだろうか?
9. 謝辞
次の個人が WebXR Anchors 仕様の設計に貢献した: