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
型となる。
-
session を frame のセッションとする。
-
device を session の XR デバイスとする。
-
trackedMeshs を、device のネイティブメッシュ検出機能を呼び出し、frame の時刻における追跡対象メッシュを取得した結果とする。
-
trackedMeshs 内の各 native mesh について、次を実行する。
-
必要に応じて、native mesh が trackedMeshs に存在しないものとして扱い、次の項目へ進む。この方法で項目を無視すべきかどうかを判断するために使用できる基準については、§ 6 プライバシーおよびセキュリティに関する考慮事項を参照。
-
session の追跡対象メッシュの集合に、 native mesh に対応するオブジェクト mesh が含まれる場合、メッシュオブジェクトを更新するアルゴリズムを mesh、native mesh、および frame とともに呼び出し、次の 項目へ進む。
-
mesh を、メッシュオブジェクトを作成する アルゴリズムを native mesh および frame とともに呼び出した結果とする。
-
mesh を session の追跡対象メッシュの集合に追加する。
-
-
このアルゴリズムの呼び出し中に作成も更新もされなかった各オブジェクトを、session の追跡対象 メッシュの集合から削除する。
-
frame の
detectedMeshesを追跡対象メッシュの集合に設定する。
XRFrame
frame からメッシュ
オブジェクトを作成するため、ユーザーエージェントは次の手順を実行しなければならない。
-
result を
XRMeshの新しいインスタンスとする。 -
result のネイティブエンティティを native mesh に設定する。
-
result の
meshSpaceを、新しいXRSpaceオブジェクトに設定する。このオブジェクトは、セッションを frame のsessionに設定し、ネイティブ原点を native mesh の ネイティブ原点を追跡するよう設定して作成される。 -
メッシュ オブジェクトを更新するアルゴリズムを、result、native mesh、および frame とともに呼び出す。
-
result を返す。
この方法で作成されたメッシュオブジェクト result は、渡されたネイティブメッシュ オブジェクト native mesh に対応するという。
XRFrame
frame からメッシュオブジェクト mesh を更新するため、
ユーザーエージェントは次の手順を実行しなければならない。
-
mesh のフレームを frame に設定する。
-
mesh の
verticesを、ネイティブメッシュ表現の差異を考慮するために必要なすべての変換を実行した、native mesh の頂点を表す 新しい頂点配列に設定する。 -
mesh の
indicesを、ネイティブメッシュ表現の差異を考慮するために必要なすべての変換を実行した、native mesh の頂点を表す 新しいインデックス配列に設定する。 -
必要に応じて、§ 6 プライバシーおよびセキュリティに関する考慮事項に記載されているとおり、 mesh の
verticesおよびindicesの詳細度を下げる。 -
mesh の
lastChangedTimeを時刻に設定する。
5. ネイティブデバイスの概念
5.1. ネイティブメッシュ検出
メッシュ検出 API は、ユーザーの環境内で検出された 3D 表面に関する情報を提供する。この仕様では、ユーザーエージェントが mesh-detection 機能を実装するため、
基盤となるプラットフォームによって提供されるネイティブメッシュ検出機能を利用できるものと想定する。具体的には、基盤となる XR
デバイスは、特定の XRFrame
の時刻に対応する時点で追跡されているすべてのメッシュを照会する方法を提供するべきである。
さらに、ネイティブメッシュオブジェクトと呼ばれる追跡対象メッシュは、フレームをまたいで同一性を維持するものと想定する。すなわち、時刻
t0 に基盤システムによって返されたメッシュオブジェクト P と、時刻
t1 に基盤システムによって返されたメッシュオブジェクト Q がある場合、
P と Q が同じ論理メッシュオブジェクトに対応するかどうかを、ユーザーエージェントが基盤システムへ照会できる。基盤システムは、
時刻 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 メッシュ検出仕様の設計に貢献した。