1. はじめに
この仕様は、新しい WebXR Device API 機能、すなわち Raw Camera Access API を導入する。新しく 導入される API は、WebXR を利用したアプリケーションがカメラ画像ピクセルにアクセスできるようにし、 この新しい情報を活用してカスタムのフレーム単位の視覚効果を計算したり、カメラ画像に重ねられた アプリ描画コンテンツのスナップショットを取得したりできるようにする。
注記: この文書で規定される API 形状は、 主にスマートフォン中心のシナリオを解決する。背景については issue #2 を参照。
1.1. 用語
この文書では、AR という頭字語を Augmented Reality を意味するものとして、VR を Virtual Reality を意味するものとして用いる。
2. 初期化
2.1. 機能記述子
アプリケーションは、適切な 機能記述子を渡すことによって、XRSession
上で生カメラアクセスを有効にするよう要求できる。このモジュールは、生カメラアクセス機能の新しい有効な
機能記述子として、新しい文字列 - camera-access を導入する。
デバイスがネイティブカメラ 機能を公開する場合、そのデバイスは生カメラアクセス機能をサポート可能である。インライン XR デバイスは、生カメラアクセス機能をサポート可能として 扱ってはならない。
生カメラアクセス機能は permissions
policy の対象であり、要求元文書のオリジンで "xr-spatial-tracking" ポリシーが許可されている
必要がある。加えて、要求元文書のオリジンで "camera" permissions
policy が許可されていなければならない。
const session= await navigator. xr. requestSession( "immersive-ar" , { requiredFeatures: [ "camera-access" ], });
3. カメラテクスチャへのアクセス
3.1. XRView
partial interface XRView { [SameObject ]readonly attribute XRCamera ?; };camera
XRView
は、このビューに関連するカメラ画像についての情報を含む XRCamera
インスタンスを参照する
camera
属性を含むように拡張される。所定の XRView
インスタンス上で camera
属性が最初にアクセスされたとき、ユーザーエージェントは カメラを取得するアルゴリズムを実行しなければならない。同じ XRView
インスタンス上での後続のアクセスは、返されたものがある場合は同じ XRCamera インスタンスに、
そうでない場合は null にならなければならない。
XRView
view のカメラを
取得するには、ユーザーエージェントは次の手順を実行しなければならない:
-
session を view の session とする。
-
camera-access 機能記述子が session の 付与された機能の集合に含まれて いない場合、
nullを返し、これらの手順を中止する。 -
frame を view の frame とする。
-
frame の active ブール値が
falseの場合、InvalidStateErrorを投げ、これらの手順を中止する。 -
frame の animationFrame ブール値が
falseの場合、InvalidStateErrorを投げ、これらの手順を中止する。 -
camera image が、frame の time に対して有効なネイティブカメラから返された、width × height テクセルのサイズのカメラ画像バッファーを含むものとする。
-
camera image が
nullの場合、nullを返し、これらの手順を中止する。 -
camera image が、必要に応じて width および height を調整することも含めて、view と 整列されたデータを含むことを確実にする。それが不可能な場合、
nullを返し、これらの手順を中止する。 -
view、camera image、width、および height を用いて camera インスタンスを作成するアルゴリズムを呼び出し、 その結果を返す。
3.2. XRCamera
[SecureContext ,Exposed =Window ]interface {XRCamera readonly attribute unsigned long ;width readonly attribute unsigned long ; };height
XRCamera
インターフェイスは、XRWebGLBinding
から取得できるカメラテクスチャについての情報を公開する方法として導入される。
XRCamera
は、camera image
の幅(テクセル単位)を含む width
属性を含む。
XRCamera
は、camera image
の高さ(テクセル単位)を含む height
属性を含む。
各 XRCamera
には、XRCamera
インスタンスが
そこから返された XRView
を含む、関連付けられた view インスタンスがある。
各 XRCamera
には、関連付けられた camera image データバッファーがある。
XRView
view、camera image、width および height から
camera インスタンスを作成するには、ユーザーエージェントは
次の手順を実行しなければならない:
-
result を、
XRCameraインターフェイスの新しいインスタンスとする。 -
result の view を view に設定する。
-
result の camera image を camera image に設定する。
-
result の
widthを width に設定する。 -
result の
heightを height に設定する。 -
result を返す。
3.3. XRWebGLBinding
partial interface XRWebGLBinding {WebGLTexture ?(getCameraImage XRCamera ); };camera
getCameraImage(camera)
メソッドは、呼び出されたとき、XRWebGLBinding
からカメラ画像を取得するために使用できる。
返される WebGLTexture
は、
非 null の場合、不透明
テクスチャである。
XRWebGLBinding
binding から、XRCamera
camera についてカメラ画像を
取得するには、ユーザーエージェントは次の手順を実行しなければならない:
-
session を binding の session とする。
-
view を camera の view とする。
-
view の session が session と一致しない場合、
InvalidStateErrorを投げ、これらの手順を中止する。 -
frame を view の frame とする。
-
frame の active ブール値が
falseの場合、InvalidStateErrorを投げ、これらの手順を中止する。 -
frame の animationFrame ブール値が
falseの場合、InvalidStateErrorを投げ、これらの手順を中止する。 -
context を binding の context とする。
-
camera image を camera の camera image とする。
-
result を、context 上で作成され、 camera image のデータを含む
WebGLTextureとする。 result は 不透明テクスチャである。 -
result を返す。
ユーザーエージェントは、バインディングおよびカメラインスタンスをキーとしてキャッシュすることを前提に、getCameraImage(camera)
呼び出しの結果を、メソッドの後続呼び出しに対して返すためにキャッシュしてもよい。ユーザーエージェントは、
キャッシュを使用する場合でも、カメラ画像を取得するアルゴリズムのステップ 6 まで(これを含む)を
実行して初期検証を行わなければならない。このキャッシュが許可されているため、アプリケーションは返された
WebGLTexture
を読み取り専用として扱うべきである。
注記: キャッシュが許可されるのは、ユーザーエージェントが
返された WebGLTexture
の寿命の所有権を保持するため(それが不透明
テクスチャと見なされるため)、また同じ requestAnimationFrame() コールバック内でこのメソッドを複数回呼び出すこと
(XRCamera、したがって
キャッシュキーの一部として推移的に XRFrame
を使用することで保証される)、同じバインディング上での呼び出し
(キャッシュキーの一部として XRWebGLBinding
を使用することで保証される)が、同一の内容を持つテクスチャになるためである。
WebGLTexture
が getCameraImage(camera)
呼び出しから返され、透明性をサポートする場合、乗算済みアルファの色を含まなければならない。
返される WebGLTexture
について、より多くの情報を指定すべきか?
例: color-renderable か、テクスチャ形式は何か、など。
4. ネイティブデバイスの概念
4.1. ネイティブカメラ
Raw Camera API 仕様は、その上で API が実装されるネイティブデバイスが、 アニメーションフレームに同期されたカメラ画像へのアクセスを提供する方法を備えていることを前提とする。 そのようなデバイスは、ネイティブ カメラ機能をサポートしていると言われる。
デバイスがカメラ画像を提供できることに加えて、Raw Camera Access API は、要求元の XRView
と整列されたカメラ画像テクスチャのみを
提供できる。カメラ画像は、カメラのポーズが XRView
の
ポーズと同じであり、カメラの視錐台が XRView
の
視錐台と同じ形状を持つ場合、その XRView
と整列されていると言われる。ネイティブカメラによって返されるカメラ画像が、
XRView
の
視錐台全体を包含する視錐台を覆っている場合、ユーザーエージェントは、その操作によって視錐台形状が
正確に一致する限り、カメラ画像を切り抜くことができる。
5. プライバシーとセキュリティに関する考慮事項
Raw Camera Access API は、現在利用可能なすべての WebXR 機能の中で最も高いプライバシー上の影響を持つ。これは、アプリケーションがユーザーの環境を直接観察できる 唯一の API であるためである。このため、ユーザーエージェントは、camera-access 機能が有効なセッションの作成を許可する前に、ユーザーの同意を求めるべきである。詳細については、 WebXR Device API § security および WebXR Device API § user-intention の各節、ならびに以下の § 5.1 ユーザー 体験 および § 5.2 プライバシーインジケーター の各節を参照。
提供されるカメラ画像が XRView
と
整列されているという要件は、API
がユーザーのプライバシーに与える影響に対する
部分的な緩和策を提供する。この要件の結果として、XR Compositor の blend technique によっては、カメラ画像がユーザーがすでに見ているものと
同じ情報を含むことになり、そのため環境のどの部分がウェブサイトから見えているかについて直接的な
フィードバックを提供する。なお、場合によっては、サイトがこの情報を抑制できる可能性がある
(たとえばスマートフォン上で、ビュー全体を包含する不透明オブジェクトを描画し、
コンポジターによってレンダリングされる環境を遮蔽する場合など)。
ユーザーエージェントがユーザーの同意を求める要件に加えて、アプリケーション開発者には、 そのユースケースを達成する他の手段がある場合、camera-access 機能を要求しないことが強く推奨される。
5.1. ユーザー体験
上記のとおり、Raw Camera Access API のプライバシー上の影響により、ユーザーエージェントは camera-access 機能が有効なセッションを作成する前に、 ユーザーの同意を求めるべきである。これは複数の方法で実現でき、その一部では ユーザーと直接やり取りする必要がある。
ユーザーと直接やり取りする例には、次のものがある:
-
どの程度細かい情報をサイトに公開するかをユーザーが選択できる許可プロンプトを表示する。 そのようなプロンプトのモックを以下に示す。
-
requestSession()呼び出しにアプリケーションが提供する要求機能および任意機能を持つセッションを作成するために必要な さまざまなレベルのユーザー同意を考慮する、一連の許可プロンプトを表示する。
この仕様の意図は、ユーザーエージェントが、提供したい体験がそれを絶対に必要としない場合に アプリ開発者へ camera-access 機能を要求するよう促さないことを確実にすることである。この機能のプライバシー上の影響により、 ユーザーエージェントは、サイトがカメラ画像へのアクセスを求めるときに追加の摩擦を導入することが許可される。 これにより、アプリケーションが不必要にこの機能を要求しないよう促されることが期待される。
ユーザーエージェントは、強力な機能 "camera" のための powerful feature に対する許可 UI(またはすでにオリジンに付与された許可)の 再利用を検討するべきである。
5.2. プライバシーインジケーター
ユーザーエージェントは、camera-access を持つ
XRSession
が作成され、まだ ended
していない間は常に、プライバシーインジケーターを表示しなければならない。セッション作成後にセッションの
付与された
機能の集合を変更できるようになる場合、インジケーターは、少なくとも camera-access 機能記述子がセッションの 付与された機能の集合に含まれている限り
表示されるべきである。
ユーザーに表示されるインジケーターは、デバイスのカメラが使用中であり、サイトがそれにアクセスできることを 伝えるべきである。そのため、ユーザーは、カメラの視野内に入るコンテンツがサイトと共有してもよいものかどうかを 確実にするため、特に注意を払うべきである。これは、録画されることに同意していない傍観者が存在する可能性のある 公共の場では特に当てはまる。
インジケーターの例には、次のものが含まれる(ただしこれらに限定されない):
-
モバイルデバイス上で、カメラが使用中であることをステータスバーに通知として表示する;
-
コンテンツが録画されていることを示唆する UI 要素(例: コンテンツの周囲の境界線、 "Record" ボタンを象徴する丸いアイコンなど)をレンダリングする;
-
録画デバイスの LED インジケーターを使用する(存在し、ユーザーエージェントが制御可能な場合);
-
セッション開始時にカメラシャッター音効果を発する;
6. 謝辞
次の個人が WebXR Raw Camera Access 仕様の設計に貢献した: