1. 序論
2. 初期化
2.1. 機能記述子
アプリケーションがセッション中に平面検出を使用することへの関心を示すには、そのセッションを 適切な機能 記述子とともに要求する必要があります。文字列 plane-detection は、平面検出機能の新しい有効な機能 記述子として、このモジュールによって導入されます。
デバイスの追跡システムがネイティブ平面検出機能を公開する場合、そのデバイスは plane-detection 機能をサポート可能です。インライン XR デバイスを、plane-detection 機能をサポート可能なものとして扱ってはなりません。
plane-detection 機能を有効にしてセッションを作成する場合、平面を更新するアルゴリズムを、そのセッションのフレーム更新のリストに追加しなければなりません。
const session= await navigator. xr. requestSession( "immersive-ar" , { requiredFeatures: [ "plane-detection" ] });
3. 平面
3.1. XRPlaneOrientation
enum {XRPlaneOrientation "horizontal" ,"vertical" };
-
"horizontal"という平面の向きは、その平面が 主として水平方向を向いていることを示します(基盤となるプラットフォームの規約に従います)。 -
"vertical"という平面の向きは、その平面が 主として垂直方向を向いていることを示します(基盤となるプラットフォームの規約に従います)。
3.2. XRPlane
[Exposed =Window ]interface { [XRPlane SameObject ]readonly attribute XRSpace ;planeSpace readonly attribute FrozenArray <DOMPointReadOnly >;polygon readonly attribute XRPlaneOrientation ?;orientation readonly attribute DOMHighResTimeStamp ;lastChangedTime readonly attribute DOMString ?; };semanticLabel
XRPlane は、
基盤となる XR システムによって検出された単一の平坦な表面を表します。
planeSpace
は、平面の座標系を確立する XRSpace
です。planeSpace
のネイティブ原点は、平面の中心を追跡します。基盤となる XR システムが、
平面の中心の正確な意味を定義します。planeSpace
によって定義される座標系の Y 軸は、平面の法線ベクトルを表さなければなりません。
各 XRPlane には、
関連付けられたネイティブエンティティがあります。
各 XRPlane には、
関連付けられたフレームがあります。
polygon
は、平面の形状を記述する頂点の配列です。これらは、多角形の辺上の点を一周するループとして返され、
planeSpace
によって定義される座標系で表現されます。各頂点の Y 座標は 0.0 でなければなりません。
semanticLabel
属性は、多角形のセマンティックラベルを記述する文字列です。セマンティック情報がない場合、この文字列は
null または空であってもかまいません。XRSystem
は、認識しているセマンティックラベルをこの属性に設定するべきです。
セマンティックラベルは、
XRSystem
が把握している XRPlane
の現実世界における名称を記述する
ASCII 小文字の DOMString です。セマンティックラベルの一覧は、セマンティックラベルレジストリで定義されます。
orientation
は、基盤となる XR システムによって分類された平面の向きを記述します。基盤となる XR システムが向きを
"horizontal"
または "vertical"
に分類できない場合、この属性は null に設定されます。
lastChangedTime
は、平面のいずれかの属性が最後に変更された時刻です。
注: 平面の姿勢は平面の
属性とはみなされないため、平面の姿勢が更新されても lastChangedTime
は変更されません。これは、平面の姿勢が、2 つの異なるエンティティ、すなわち planeSpace
と、getPose()
関数によって姿勢を計算する際の基準となる XRSpace
から導出されるプロパティであるためです。
4. 検出された平面の取得
4.1. XRPlaneSet
[Exposed =Window ]interface {XRPlaneSet readonly setlike <XRPlane >; };
XRPlaneSet
は、XRPlane
のコレクションです。これは、
XRFrame
で検出された平面のコレクションを取得するための主要な仕組みです。
partial interface XRFrame {readonly attribute XRPlaneSet ; };detectedPlanes
XRFrame
は、フレーム内で引き続き追跡されているすべての平面を含む detectedPlanes
属性を持つよう拡張されます。この集合は最初は空であり、平面を
更新するアルゴリズムによって設定されます。フレームがアクティブでないときにこの属性へアクセスした場合、
ユーザーエージェントは InvalidStateError
を投げなければなりません。
partial interface XRSession {Promise <undefined >(); };initiateRoomCapture
XRSession
は、関連付けられた追跡される平面の集合を持つよう拡張され、この集合は最初は
空です。集合の要素は XRPlane 型になります。
XRSession
は、真偽値のルームキャプチャ完了を持つよう拡張され、この値は最初は
false です。
XR デバイスが手動キャプチャをサポートする場合、そのデバイスは真偽値を返す非同期のルームキャプチャメソッドを持ちます。
XRSession
は、initiateRoomCapture
メソッドを持つようにも拡張されます。このメソッドは、サポートされている場合、XR
デバイスに現在の部屋のレイアウトをキャプチャするよう要求します。これによって追跡される
平面の集合を置換するか拡張するかは、XR
デバイスに委ねられます。
-
session を this とします。
-
promise を、session の関連するレルムにおける新しい Promise とします。
-
session の
ended値が `true` の場合、promise を "InvalidStateError"DOMExceptionで拒否し、 promise を返します。 -
ルームキャプチャ完了が `true` の場合、 promise を "
InvalidStateError"DOMExceptionで拒否し、promise を返します。 -
plane-detection 機能記述子が、 session のXR デバイスにおける session のモード用の有効な機能のリストに含まれていない場合、 promise を "
NotSupportedError"DOMExceptionで拒否し、 promise を返します。 -
session のXR デバイスが手動キャプチャをサポートしていない場合、または
XRSystemがルームキャプチャは不要であると判断した場合:-
session のルームキャプチャ完了を `true` に設定します。
-
promise を解決します。
-
promise を返します。
-
-
次の手順を実行するタスクをキューに入れます。
-
session のXR デバイスのルームキャプチャメソッドを呼び出して結果を待ち、その結果を result に代入します。
-
次の手順を実行します。
- result が `true` の場合:
-
promise を解決します。
- それ以外の場合:
-
promise を "
OperationError"DOMExceptionで拒否します。
-
session のルームキャプチャ完了を `true` に設定します。
-
-
promise を返します。
-
session を、frame のセッションとします。
-
device を、session のXR デバイスとします。
-
plane-detection 機能記述子が、 session のモード用の device の有効な機能のリストに含まれていない場合、これらの手順を中止します。
-
trackedPlanes を、frame の時刻における追跡中の平面を取得するために、device のネイティブ平面検出機能を呼び出した結果とします。
-
trackedPlanes 内の各 native plane について、次を実行します。
-
必要に応じて、native plane が trackedPlanes に存在しなかったものとして扱い、次の項目へ進みます。この方法で項目を 無視するかどうかを判断するために使用できる基準については、§ 6 プライバシーとセキュリティに関する考慮事項を参照してください。
-
session の追跡される平面の集合に、 native plane に対応するオブジェクト plane が含まれている場合、 plane、native plane、および frame を指定して平面オブジェクトを更新するアルゴリズムを呼び出し、次の 項目へ進みます。
-
plane を、native plane および frame を指定して平面オブジェクトを作成する アルゴリズムを呼び出した結果とします。
-
plane を session の追跡される平面の集合に追加します。
-
-
このアルゴリズムの呼び出し中に作成も更新もされなかった各オブジェクトを、session の追跡される 平面の集合から削除します。
-
frame の
detectedPlanesを追跡される平面の集合に設定します。
XRFrame
frame から平面
オブジェクトを作成するために、ユーザーエージェントは次の手順を実行しなければなりません。
-
result を
XRPlaneの新しいインスタンスとします。 -
result のネイティブエンティティを native plane に設定します。
-
result の
planeSpaceを、session が frame のsessionに設定され、ネイティブ原点が native plane の ネイティブ原点を追跡するよう設定された新しいXRSpaceオブジェクトに設定します。 -
result、native plane、および frame を指定して平面オブジェクトを更新するアルゴリズムを呼び出します。
-
result を返します。
このように作成された平面オブジェクト result は、渡されたネイティブ平面 オブジェクト native plane に対応するといいます。
XRFrame
frame から平面
オブジェクトを更新するために、ユーザーエージェントは次の手順を実行しなければなりません。
-
plane のフレームを frame に設定します。
-
native plane が基盤となるシステムによって垂直として分類される場合、 plane の
orientationを"vertical"に設定します。それ以外で、native plane が基盤となるシステムによって水平として分類される場合、 plane のorientationを"horizontal"に設定します。それ以外の場合、plane のorientationをnullに設定します。 -
plane の
polygonを、ネイティブ平面における多角形の表現の違いを考慮するために必要なすべての変換を行った、 native plane の多角形を表す新しい頂点配列に設定します。 -
plane の
semanticLabelを、セマンティックラベルを含む新しい文字列に設定します。 -
必要に応じて、§ 6 プライバシーとセキュリティに関する考慮事項で説明されているように、 plane の
polygonの詳細度を低下させます。 -
plane の
lastChangedTimeを時刻に設定します。
次の例は、アプリケーションが検出された平面に関する情報を取得し、それに応じて処理する方法を示します。 平面のグラフィカルな表現を描画するために使用できるコードは示していません。
// `planes` は、アプリケーションが認識しているすべての検出済み平面と、 // それらが更新されたタイムスタンプを追跡します。最初は空のマップです。 const planes= Map(); function onXRFrame( timestamp, frame) { const detectedPlanes= frame. detectedPlanes; // まず、認識していた平面のいずれかが追跡されなくなったかどうかを確認します。 for ( const [ plane, timestamp] of planes) { if ( ! detectedPlanes. has( plane)) { // 削除された平面を処理します。`plane` は前のフレームには存在しましたが、 // 現在は追跡されていません。 // その平面が存在しなくなったことが分かっているため、マップから削除します。 planes. delete ( plane); } } // 次に、引き続き追跡されているすべての平面を処理します。 // これには、以前に確認した追跡中の平面(更新されている可能性があります)と、 // 新しい平面の両方が含まれます。 detectedPlanes. forEach( plane=> { if ( planes. has( plane)) { // 以前に確認した平面を処理します。 if ( plane. lastChangedTime> planes. get( plane)) { // 更新された、以前に確認した平面を処理します。 // これは、平面のいずれかのプロパティが以前とは異なることを意味します。 // 最も可能性が高いのは、多角形が変更されたことです。 ... // 平面を描画する、または描画用に準備するなど。 // 平面を更新した時刻を更新します。 planes. set( plane, plane. lastChangedTime); } else { // 現在のフレームで更新されなかった、以前に確認した平面を処理します。 // 他の空間を基準とする平面の姿勢は変更されている可能性があることに注意してください。 } } else { // 新しい平面を処理します。 // 平面を更新した時刻を設定します。 planes. set( plane, plane. lastChangedTime); } // 平面を以前に確認したかどうか、または更新されたかどうかにかかわらず、 // その姿勢は変更されている可能性があります。 const planePose= frame. getPose( plane. planeSpace, xrReferenceSpace); }); frame. session. requestAnimationFrame( onXRFrame); }
5. ネイティブデバイスの概念
5.1. ネイティブ平面検出
平面検出 API は、ユーザーの環境で検出された平坦な表面に関する情報を提供します。この仕様では、
ユーザーエージェントが plane-detection 機能を実装するために、基盤となるプラットフォームが提供するネイティブ平面検出機能に依存できると仮定します。具体的には、基盤となる
XR デバイスは、特定の XRFrame
の時刻に対応する時点で追跡されているすべての平面を照会する方法を提供するべきです。
さらに、ネイティブ平面オブジェクトと呼ばれる追跡中の平面は、
フレーム間でその同一性を維持すると仮定します。つまり、時刻
t0 に基盤となるシステムから返された平面オブジェクト P と、時刻
t1 に基盤となるシステムから返された平面オブジェクト Q がある場合、
P と Q が同じ論理的な平面オブジェクトに対応するかどうかを、ユーザーエージェントが
基盤となるシステムへ照会できるものとします。また、基盤となるシステムは、時刻 t における
姿勢の位置を照会するために使用できるネイティブ原点を提供することも期待されます。ただし、平面の姿勢が
常に判明するとは限りません(たとえば、引き続き追跡されているものの、ある時点では位置を特定できない平面などです)。さらに、ネイティブ
平面オブジェクトは、検出された平面のおおよその形状を記述する多角形を公開するべきです。
さらに、基盤となるシステムは、XRAnchor
を作成する目的では、ネイティブ平面をネイティブエンティティとして認識するべきです。詳細については、WebXR Anchors Module
§ native-anchor の節を参照してください。
6. プライバシーとセキュリティに関する考慮事項
平面検出 API は、ユーザーの物理的な環境に関する情報を公開します。ユーザーエージェントの判断により、
公開される平面情報(平面の多角形など)が制限される場合があります。ユーザーエージェントが公開する情報を
削減できる方法には、次のものがあります。平面オブジェクトを更新するアルゴリズム内で平面の多角形の詳細度を低下させること
(たとえば、頂点の数を減らすか、頂点の座標を丸める、または量子化すること)、
あるいは、平面を更新するアルゴリズムの
trackedPlanes
コレクションに平面オブジェクトが存在しなかったかのように振る舞い、平面自体を完全に削除することです(たとえば、
検出された平面が小さすぎる、または詳細すぎて公開すべきではないと判断され、平面について公開される詳細を削減する仕組みが
ユーザーエージェントに実装されていない場合に、この処理を行えます)。平面の姿勢
(planeSpace
から取得可能)も量子化できます。
平面検出 API の概念は、[webxr-anchors-module] 仕様で公開されるメソッドで使用できるため、WebXR Anchors Module に関連するプライバシーとセキュリティに関する考慮事項の一部は、 ここにも適用されます。詳細については、WebXR Anchors Module § privacy-security の節を参照してください。
平面検出 API が WebXR Device API を拡張する方法により、WebXR Device API § 13. セキュリティ、プライバシー、および快適性に関する考慮事項の節も、WebXR Plane Detection Module が公開する 機能に適用されます。
7. 謝辞
次の方々が、WebXR Plane Detection 仕様の設計に貢献しました。