WebXR メッシュ検出モジュール

コミュニティグループ報告書草案,

この文書の詳細
このバージョン:
https://github.com/immersive-web/real-world-meshing/
課題追跡:
GitHub
編集者:
(Meta)
参加:
課題を報告 (未解決の課題)
メーリングリストのアーカイブ
W3C の #immersive-web IRC

概要

この文書の位置付け

1. はじめに

2. 初期化

2.1. 機能記述子

アプリケーションがセッション中にメッシュ検出を使用する意図を示すには、そのセッションを適切な機能 記述子とともに要求する必要がある。文字列 mesh-detection は、メッシュ検出機能の新しい有効な機能記述子としてこのモジュールにより導入される。

デバイスの追跡システムがネイティブメッシュ検出機能を公開する場合、デバイスは mesh-detection 機能をサポート可能である。インライン XR デバイスを、mesh-detection 機能をサポート可能であるものとして扱ってはならない。

mesh-detection 機能を有効にしてセッションが作成された場合、メッシュを更新するアルゴリズムを、そのセッションのフレーム更新のリストに追加しなければならない。

次のコードは、メッシュ検出を必要とするセッションを要求する方法を示す。
const session = await navigator.xr.requestSession("immersive-ar", {
  requiredFeatures: ["mesh-detection"]
});

3. メッシュ

3.1. XRMesh

[Exposed=Window] interface XRMesh {
    [SameObject] readonly attribute XRSpace meshSpace;

    readonly attribute Float32Array vertices;
    readonly attribute Uint32Array indices;
    readonly attribute DOMHighResTimeStamp lastChangedTime;
    readonly attribute DOMString? semanticLabel;
};

XRMesh は、基盤となる XR システムによって検出された 3D ジオメトリの単一のインスタンスを表す。

meshSpace は、メッシュの座標系を確立する XRSpace である。meshSpaceネイティブ原点は、メッシュの中心を追跡する。基盤となる XR システムが、メッシュ中心の正確な意味を定義する。meshSpace によって定義される座標系の Y 軸は、メッシュの法線ベクトルを表さなければならない。

XRMesh には、 関連付けられたネイティブエンティティがある。

XRMesh には、 関連付けられたフレームがある。

vertices は、メッシュの形状を記述する頂点の配列である。これらは、meshSpace によって定義される座標系で表現される。

indices は、メッシュの各頂点のインデックスを記述するインデックスの配列である。

lastChangedTime は、メッシュ属性のいずれかが最後に変更された時刻である。

注: メッシュの姿勢はメッシュ 属性とはみなされないため、メッシュの姿勢を更新しても lastChangedTime は変化しない。これは、メッシュの姿勢が、meshSpace と、getPose() 関数を介して姿勢を計算する際の基準となる XRSpace という、2 つの異なるエンティティから導出されるプロパティだからである。

4. 検出されたメッシュの取得

4.1. XRMeshSet

[Exposed=Window] interface XRMeshSet {
  readonly setlike<XRMesh>;
};

XRMeshSet は、 XRMesh のコレクションである。これは、XRFrame で検出されたメッシュのコレクションを取得するための主要な仕組みである。

partial interface XRFrame {
  readonly attribute XRMeshSet detectedMeshes;
};

XRFrame は、そのフレームで引き続き追跡されているすべてのメッシュを含む detectedMeshes 属性を含むように拡張される。この集合は初期状態では空であり、メッシュを 更新するアルゴリズムによって設定される。フレームがアクティブでないときにこの属性へアクセスした場合、 ユーザーエージェントは InvalidStateError をスローしなければならない。

XRSession も、関連付けられた追跡対象メッシュの集合を含むように拡張される。この集合は初期状態では 空である。集合の要素は XRMesh 型となる。

frameメッシュを 更新するため、ユーザーエージェントは次の手順を実行しなければならない。
  1. sessionframeセッションとする。

  2. devicesessionXR デバイスとする。

  3. trackedMeshs を、deviceネイティブメッシュ検出機能を呼び出し、frame時刻における追跡対象メッシュを取得した結果とする。

  4. trackedMeshs 内の各 native mesh について、次を実行する。

    1. 必要に応じて、native meshtrackedMeshs に存在しないものとして扱い、次の項目へ進む。この方法で項目を無視すべきかどうかを判断するために使用できる基準については、§ 6 プライバシーおよびセキュリティに関する考慮事項を参照。

    2. session追跡対象メッシュの集合に、 native mesh対応するオブジェクト mesh が含まれる場合、メッシュオブジェクトを更新するアルゴリズムを meshnative mesh、および frame とともに呼び出し、次の 項目へ進む。

    3. mesh を、メッシュオブジェクトを作成する アルゴリズムを native mesh および frame とともに呼び出した結果とする。

    4. meshsession追跡対象メッシュの集合に追加する。

  5. このアルゴリズムの呼び出し中に作成も更新もされなかった各オブジェクトを、session追跡対象 メッシュの集合から削除する。

  6. framedetectedMeshes追跡対象メッシュの集合に設定する。

ネイティブメッシュオブジェクト native mesh および XRFrame frame からメッシュ オブジェクトを作成するため、ユーザーエージェントは次の手順を実行しなければならない。
  1. resultXRMesh の新しいインスタンスとする。

  2. resultネイティブエンティティnative mesh に設定する。

  3. resultmeshSpace を、新しい XRSpace オブジェクトに設定する。このオブジェクトは、セッションframesession に設定し、ネイティブ原点native mesh の ネイティブ原点を追跡するよう設定して作成される。

  4. メッシュ オブジェクトを更新するアルゴリズムを、resultnative mesh、および frame とともに呼び出す。

  5. result を返す。

この方法で作成されたメッシュオブジェクト result は、渡されたネイティブメッシュ オブジェクト native mesh対応するという。

ネイティブメッシュオブジェクト native mesh および XRFrame frame からメッシュオブジェクト mesh更新するため、 ユーザーエージェントは次の手順を実行しなければならない。
  1. meshフレームframe に設定する。

  2. meshvertices を、ネイティブメッシュ表現の差異を考慮するために必要なすべての変換を実行した、native mesh の頂点を表す 新しい頂点配列に設定する。

  3. meshindices を、ネイティブメッシュ表現の差異を考慮するために必要なすべての変換を実行した、native mesh の頂点を表す 新しいインデックス配列に設定する。

  4. 必要に応じて、§ 6 プライバシーおよびセキュリティに関する考慮事項に記載されているとおり、 meshvertices および indices の詳細度を下げる。

  5. meshlastChangedTime時刻に設定する。

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

5.1. ネイティブメッシュ検出

メッシュ検出 API は、ユーザーの環境内で検出された 3D 表面に関する情報を提供する。この仕様では、ユーザーエージェントが mesh-detection 機能を実装するため、 基盤となるプラットフォームによって提供されるネイティブメッシュ検出機能を利用できるものと想定する。具体的には、基盤となる XR デバイスは、特定の XRFrame時刻に対応する時点で追跡されているすべてのメッシュを照会する方法を提供するべきである。

さらに、ネイティブメッシュオブジェクトと呼ばれる追跡対象メッシュは、フレームをまたいで同一性を維持するものと想定する。すなわち、時刻 t0 に基盤システムによって返されたメッシュオブジェクト P と、時刻 t1 に基盤システムによって返されたメッシュオブジェクト Q がある場合、 PQ が同じ論理メッシュオブジェクトに対応するかどうかを、ユーザーエージェントが基盤システムへ照会できる。基盤システムは、 時刻 t における姿勢の位置を照会するために使用できるネイティブ原点も提供することが期待される。ただし、メッシュの姿勢が常に既知であることは保証されない。たとえば、 引き続き追跡されているものの、特定の時点では位置を特定できないメッシュが該当する。加えて、ネイティブ メッシュオブジェクトは、検出されたメッシュのおおよその形状を記述するポリゴンを公開するべきである。

さらに、基盤システムは、XRAnchor の作成を目的として、ネイティブメッシュをネイティブエンティティとして認識するべきである。詳細については、WebXR アンカーモジュール § native-anchor の節を参照。

6. プライバシーおよびセキュリティに関する考慮事項

メッシュ検出 API は、ユーザーの物理的環境に関する情報を公開する。公開されるメッシュ 情報(メッシュのポリゴンなど)は、ユーザーエージェントの判断により制限される場合がある。ユーザーエージェントが公開される情報を削減できる方法には、メッシュオブジェクトを更新するアルゴリズムでメッシュのポリゴンの詳細度を下げること(たとえば、 頂点数を減らす、または頂点の座標を丸める、もしくは量子化すること)や、メッシュを更新するアルゴリズムの trackedMeshs コレクションにメッシュオブジェクトが 存在しないかのように動作して、そのメッシュを完全に削除することがある(たとえば、検出されたメッシュが公開するには小さすぎる、または詳細すぎると判断され、 メッシュで公開される詳細を削減する仕組みがユーザーエージェントに実装されていない場合に行われる可能性がある)。メッシュの姿勢(meshSpace から取得可能)も量子化できる。

メッシュ検出 API の概念は、[webxr-anchors-module] 仕様によって公開されるメソッドで使用できるため、WebXR アンカーモジュールに関連するプライバシーおよびセキュリティに関する考慮事項の一部は、ここにも適用される。詳細については、WebXR アンカーモジュール § privacy-security の節を参照。

メッシュ検出 API が WebXR Device API を拡張する方法により、WebXR Device API § 13. セキュリティ、プライバシー、および快適性に関する考慮事項の節も、WebXR メッシュ検出モジュールによって公開される機能に適用される。

7. 謝辞

次の各氏は、WebXR メッシュ検出仕様の設計に貢献した。

適合性

文書 規約

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

明示的に非規定と記された節、例、および注記を除き、 この仕様のすべてのテキストは規定である。[RFC2119]

この仕様の例は、「たとえば」という語で導入されるか、 次のように class="example" を用いて 規定テキストとは分けて示される。

これは参考例の一例である。

参考注記は「注」という語で始まり、 次のように class="note" を用いて 規定テキストとは分けて示される。

注: これは参考注記である。

索引

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

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

参考文献

規定参考文献

[HR-TIME-3]
Yoav Weiss. 高精度時刻. URL: https://w3c.github.io/hr-time/
[RFC2119]
S. Bradner. 要件レベルを 示すために RFC で使用するキーワード. 1997年3月. 現行の最良の慣行. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 現行 標準. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR デバイス API. URL: https://immersive-web.github.io/webxr/

参考参考文献

[WEBXR-ANCHORS-MODULE]
Piotr Bialecki. WebXR アンカーモジュール. DR. URL: https://immersive-web.github.io/anchors/

IDL 索引

[Exposed=Window] interface XRMesh {
    [SameObject] readonly attribute XRSpace meshSpace;

    readonly attribute Float32Array vertices;
    readonly attribute Uint32Array indices;
    readonly attribute DOMHighResTimeStamp lastChangedTime;
    readonly attribute DOMString? semanticLabel;
};

[Exposed=Window] interface XRMeshSet {
  readonly setlike<XRMesh>;
};

partial interface XRFrame {
  readonly attribute XRMeshSet detectedMeshes;
};