WebXR アンカー・モジュール

編集者草案,

この文書の詳細
このバージョン:
https://immersive-web.github.io/anchors/
課題追跡:
GitHub
仕様内インライン
編集者:
(Google)
元編集者:
(Google)
参加:
課題を提出 (未解決の課題)
メーリングリストのアーカイブ
W3C の #immersive-web IRC

概要

基盤となるシステムによって追跡されるアンカーを作成する方法について記述する。

この文書のステータス

この節は、公開時点におけるこの文書のステータスを説明する。現在の W3C 公開物の一覧およびこの 技術レポートの最新リビジョンは、 W3C 技術 レポート索引(http://www.w3.org/TR/)で確認できる。

この文書は、Immersive Web Working Group によって 編集者草案として公開された。この文書は、W3C 勧告となることを意図している。 この仕様へのフィードバックおよびコメントを歓迎する。 Github issues を使用されたい。 議論は、 public-immersive-web-wg@w3.org アーカイブでも確認できる。

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

この文書は、 W3C 特許ポリシーの下で運営されるグループによって作成された。 W3C は、このグループの成果物に関連して行われた 特許 開示の公開リストを維持している。そのページには、 特許を開示するための手順も含まれている。個人が、 必須 クレームを含むとその個人が信じる特許について実際に知っている場合、その情報を W3C 特許ポリシー 第 6 節に従って開示しなければならない。

この文書は、2025年8月18日 W3C プロセス文書によって管理される。

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 を含む。この属性が、deletedtrue に設定されているときにアクセスされた場合、ユーザーエージェントは InvalidStateError を投げなければならない。

XRAnchor には、初期値が false に設定される、関連付けられた deleted ブール値がある。

XRAnchor には、関連付けられた native origin がある。

XRAnchor には、関連付けられた session がある。

native origin および session から新しい anchor オブジェクトを作成するには、ユーザーエージェントは 次の手順を実行しなければならない:
  1. anchor を、新しい XRAnchor とする。

  2. anchornative originnative origin に設定する。

  3. anchorsessionsession に設定する。

  4. anchordeletedfalse に設定する。

  5. anchoranchorSpace を、anchorsession に設定された session と、native origin に設定された native origin を用いて作成された、新しい XRSpace オブジェクトに設定する。

  6. anchor を返す。

requestPersistentHandle() メソッドは、XRAnchor anchor 上で呼び出されたとき、次の手順を実行しなければならない:
  1. promise を、この XRSystem関連するレルム内の新しい Promise とする。

  2. anchordeletedtrue の場合、promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  3. sessionanchorsession とする。

  4. sessionmap of persistent anchors が値 anchor を含む場合、次の手順を実行する:

    1. uuid を、 sessionmap of persistent anchors 上の anchor 値のマッピングのキーとする。

    2. promiseuuid解決する。

    3. promise を返す。

    4. これらの手順を中止する。

  5. uuid を空文字列とする。

  6. UUID [RFC9562] を文字列として生成し、 uuid に追加する。

  7. uuid および anchor を、sessionmap of persistent anchors に追加する。

  8. promiseuuid解決する。

  9. promise を返す。

注記: XRSystem が一意な ID を作成する場合、それは一意であり、現在のオリジンにのみ知られていなければならない。

4. アンカーの作成

XRSession は、関連付けられた set of tracked anchors を含むように拡張される。

XRSession は、UUID 文字列をキーとし、XRAnchor にマップする、関連付けられた map of persistent anchors を含むように拡張される。 このマップは、XR device によって作成および保存され、origin 上の任意の XRSession によって作成され、まだ破棄されていない永続アンカーの集合のみに制限される。 このマップのサイズはユーザーエージェントによって決定される。ユーザーエージェントは任意の理由で このマップからエントリを削除してもよい。たとえば、すべてのオリジンに対するすべてのマップで システムアンカーの最大数に達した場合、ユーザーエージェントは新しく 要求されたアンカーのための空き領域を作るためにエントリを解放してもよい。

XRSession は、XRAnchor オブジェクトをキーとし、 Promise<XRAnchor> オブジェクトにマップする、関連付けられた map of new anchors を含むように拡張される。

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 entitynull に設定されていると仮定される。

アプリケーションは、次の 2 つの方法のいずれかでアンカーを作成できる:

フレームからアンカーを作成するには、アプリケーションは XRFramecreateAnchor(pose, space) メソッドを呼び出すことができる。

createAnchor(pose, space) メソッドは、XRFrame frame 上で pose および space とともに呼び出されたとき、次の手順を実行しなければならない:
  1. promise新しい Promise とする。

  2. frameactive ブール値が false の場合、promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  3. sessionframesession とする。

  4. update anchors アルゴリズムがまだ存在しない場合、それを sessionlist of frame updates に追加する。

  5. devicesessionXR device とする。

  6. effective originspaceeffective origin とする。

  7. anchor native origin を、devicepose を用いて新しいアンカーを作成する呼び出しから 返された新しい native origin とする。この pose は、 frametime において effective origin に対して相対的に表現されたものとして解釈される。

  8. anchor native origin および session を用いて、新しい anchor オブジェクトを作成する anchor

  9. anchorsessionset of tracked anchors に追加する。

  10. anchor から promise へのマッピングを sessionmap of new anchors に追加する。

  11. promise を返す。

注記:createAnchor(pose, space) 呼び出しによって返されるアンカーが追跡する物理的な原点が、メソッドが呼び出されたフレームによって表される時点で、 space 内の pose の物理的位置と可能な限り近く整合することを確実にするのは、ユーザーエージェントの責任である。 具体的には、これは、動的に変化する空間について、ユーザーエージェントがアプリの指定した時刻におけるそのような空間の native origin を 捕捉しようとするべきであることを意味する。このテキストは非規範的であるが、仕様の著者および コントリビューターの意図を表しているため、異なるベンダー間で一貫した動作を確保するために、 実装が従うことが強く推奨される。

persistentAnchors は、既知の永続アンカーのリストを返す。このリストは、map of persistent anchors のキーを反映しなければならない。
restorePersistentAnchor(uuid) メソッドは、XRSession session 上で uuid とともに呼び出されたとき、次の手順を実行しなければならない:
  1. promise を、この XRSystem関連するレルム内の新しい Promise とする。

  2. sessionmap of persistent anchorsuuid から XRAnchor へのマッピングを含まない場合、 promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  3. sessionended 値が `true` の場合、promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  4. anchor を、sessionmap of persistent anchors 上の uuid からのマッピングの値とする。

  5. sessionmap of new anchorsanchor から promise へのマッピングを含む場合、 promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  6. sessionmap of new anchors がユーザーエージェントの 最大サイズに達している場合、promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  7. anchorsessionset of tracked anchors に追加する。

  8. anchor から promise へのマッピングを sessionmap of new anchors に追加する。

  9. promise を返す。

deletePersistentAnchor() メソッドは、XRSession session 上で uuid とともに呼び出されたとき、次の手順を実行しなければならない:
  1. promise を、この XRSystem関連するレルム内の新しい Promise とする。

  2. sessionmap of persistent anchorsanchor へのマッピングを含まない場合、promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  3. anchor を、sessionmap of persistent anchors 上の uuid からのマッピングの値とする。

  4. sessionmap of persistent anchors からマッピングを削除する。

  5. anchor 上で delete() を呼び出す。

  6. promise を返す。

ヒットテスト結果からアンカーを作成するには、アプリケーションは XRHitTestResultcreateAnchor() メソッドを呼び出すことができる。

createAnchor() メソッドは、XRHitTestResult hitTestResult 上で呼び出されたとき、次の手順を実行しなければならない:
  1. promise新しい Promise とする。

  2. framehitTestResultframe とする。

  3. frameactive ブール値が false の場合、promiseInvalidStateError却下し、 promise を返し、これらの手順を中止する。

  4. sessionframesession とする。

  5. update anchors アルゴリズムがまだ存在しない場合、それを sessionlist of frame updates に追加する。

  6. devicesessionXR device とする。

  7. nativeEntityhitTestResultnative entity とする。

  8. anchor native origin を、devicehitTestResultnative origin に位置し、frametime において nativeEntityattached された新しいアンカーを作成する呼び出しから返された、 新しい native origin とする。

  9. anchor native origin および session を用いて、新しい anchor オブジェクトを作成する anchor

  10. anchorsessionset of tracked anchors に追加する。

  11. anchor から promise へのマッピングを sessionmap of new anchors に追加する。

  12. 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 アルゴリズムによって設定される。

frame のアンカーを更新するには、 ユーザーエージェントは次の手順を実行しなければならない:
  1. sessionframesession とする。

  2. devicesessionXR device とする。

  3. sessionset of tracked anchors 内の各 anchor について、次を実行する:

    1. anchornative origin 情報について、device の追跡システムに問い合わせる。

    2. device の追跡システムが anchor をもはやtracks しない場合、次の手順を実行する:

      1. anchorsessionset of tracked anchors から削除する。

      2. sessionmap of new anchorsanchor から promise へのマッピングを含む場合、promise却下し、そのマッピングを削除する。

      3. sessionset of tracked anchors 内の次のエントリに 続行する。

    3. anchorframetrackedAnchors 集合に追加する。

    4. sessionmap of new anchorsanchor から promise へのマッピングを含む場合、 promiseanchor解決し、そのマッピングを削除する。

6. アンカーの削除

アプリケーションがアンカーへの更新を受け取ることにもはや関心がない場合、delete() を呼び出すことで、 アンカーを削除できる。

delete() メソッドは、XRAnchor anchor 上で呼び出されたとき、次の手順を実行することで アンカーを削除するものとする:
  1. anchordeletedtrue の場合、これらの手順を中止する。

  2. anchoranchorSpacenull に設定する。

  3. anchordeletedtrue に設定する。

  4. sessionanchorsession とする。

  5. devicesessionXR device とする。

  6. native originanchornative origin とする。

  7. native origin をもはや追跡しないことを device の追跡システムに通知する。

  8. anchorsessionset of tracked anchors から削除する。

7. ネイティブデバイスの概念

ユーザーエージェントが anchors API を実装できるようにするには、基盤となる XR デバイスが この機能のネイティブサポートを提供するべきである。この節では、基盤となる XR システムに課される要件を説明し、さまざまなフレームワーク / デバイス上で anchors API を 実装できるようにするため、必要上、不完全に規定されている。

7.1. ネイティブアンカー

基盤となる XR device は、アンカーに関連する次の機能をサポートしている場合、 サポート可能anchors 機能を持つ:

基盤となるデバイスがネイティブアンカーをサポートしない場合、ユーザーエージェントは エミュレートされたネイティブアンカーを通じて anchors API を実装することを決定してもよい。 このアプローチでは、アンカーは作成されると、そのポーズは決して変化せず、そのポーズは、XRFramecreateAnchor(pose, space)XRHitTestResultcreateAnchor() などのアンカー作成メソッドにアプリケーションが渡したポーズであると仮定する。

注記: エミュレートされたネイティブアンカー のアプローチは、アプリケーションが anchors 機能を自分自身でエミュレートすることと等価であり、 アプリケーションが処理する必要のあるさまざまな場合の数を減らすのに役立つ場合がある。また、 アプリケーションが "immersive-ar" および "immersive-vr" セッションで同じコードを再利用できるようにする可能性もある。

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

anchors API は、ユーザー環境に関する情報へのアクセスを直接公開しない。 セッションが hit-test サポートを 有効にして作成され、デバイスが移動するオブジェクトの追跡をサポートする場合、アプリケーションは、 たとえば持ち運ばれているオブジェクトのアンカーポーズの変化を観察することによって、 ユーザー環境のレイアウトを推測できる可能性がある。これは、 hit-testing API と同程度のユーザー環境に関する情報を提供する。アンカー機能は XR セッションを 作成するときに宣言されなければならず、これによりユーザーエージェントは anchors API の使用を ウェブサイトに許可することの潜在的なプライバシー上の影響についてユーザーに通知できる。

一般的な移動するオブジェクトの追跡を サポートするデバイスを認識していない - それらは仕様でまったく考慮されるべきだろうか?そのようなデバイスの 例はあるだろうか?

9. 謝辞

次の個人が WebXR Anchors 仕様の設計に貢献した:

適合性

文書の 慣例

適合要件は、 記述的な表明と 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" を用いて、 次のように示される:

Note, これは情報提供の注記である。

適合 アルゴリズム

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

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

索引

この仕様で定義される 用語

参照により定義される 用語

参考文献

規範的参考文献

[HTML]
Anne van Kesteren; et al. HTML 標準. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. RFC における要件レベルを 示すために用いるキーワード. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC9562]
K. Davis; B. Peabody; P. Leach. 汎用一意 識別子(UUID). May 2024. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9562
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. URL: https://immersive-web.github.io/webxr/
[WEBXR-AR-MODULE-1]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Augmented Reality Module - Level 1. URL: https://immersive-web.github.io/webxr-ar-module/

IDL 索引

[SecureContext, Exposed=Window]
interface XRAnchor {
  readonly attribute XRSpace anchorSpace;

  Promise<DOMString> requestPersistentHandle();

  undefined delete();
};

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();
};

[Exposed=Window]
interface XRAnchorSet {
  readonly setlike<XRAnchor>;
};

partial interface XRFrame {
  [SameObject] readonly attribute XRAnchorSet trackedAnchors;
};

課題索引

Session の "list of frame updates" には順序を指定する方法が必要になる可能性がある - 一部の アルゴリズムは他のものに依存する場合がある。
一般的な移動するオブジェクトの追跡をサポートするデバイスを認識していない - それらは 仕様でまったく考慮されるべきだろうか?そのようなデバイスの例はあるだろうか?
MDN

XRAnchor/anchorSpace

In only one current engine.

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

XRAnchor/delete

In only one current engine.

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

XRAnchor

In only one current engine.

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

XRAnchorSet

In only one current engine.

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

XRFrame/createAnchor

In only one current engine.

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

XRFrame/trackedAnchors

In only one current engine.

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

XRHitTestResult/createAnchor

In only one current engine.

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