WebXR 生カメラアクセス・モジュール

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

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

概要

この仕様は、デバイスがカメラ画像のレンダリングを担う場合に、immerisve-ar セッションの背後に表示される 生カメラ画像にアクセスする手段を提供する。

この文書のステータス

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 が許可されていなければならない。

次のコードは、Raw Camera Access API を必要とするセッションを要求する方法を示している:
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カメラを 取得するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionviewsession とする。

  2. camera-access 機能記述子が session付与された機能の集合含まれて いない場合、null を返し、これらの手順を中止する。

  3. frameviewframe とする。

  4. frameactive ブール値が false の場合、InvalidStateError投げ、これらの手順を中止する。

  5. frameanimationFrame ブール値が false の場合、InvalidStateError投げ、これらの手順を中止する。

  6. camera image が、frametime に対して有効なネイティブカメラから返された、width × height テクセルのサイズのカメラ画像バッファーを含むものとする。

  7. camera imagenull の場合、null を返し、これらの手順を中止する。

  8. camera image が、必要に応じて width および height を調整することも含めて、view整列されたデータを含むことを確実にする。それが不可能な場合、 null を返し、これらの手順を中止する。

  9. viewcamera imagewidth、および 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 viewcamera imagewidth および height から camera インスタンスを作成するには、ユーザーエージェントは 次の手順を実行しなければならない:
  1. result を、XRCamera インターフェイスの新しいインスタンスとする。

  2. resultviewview に設定する。

  3. resultcamera imagecamera image に設定する。

  4. resultwidthwidth に設定する。

  5. resultheightheight に設定する。

  6. result を返す。

3.3. XRWebGLBinding

partial interface XRWebGLBinding {
  WebGLTexture? getCameraImage(XRCamera camera);
};

getCameraImage(camera) メソッドは、呼び出されたとき、XRWebGLBinding からカメラ画像を取得するために使用できる。 返される WebGLTexture は、 非 null の場合、不透明 テクスチャである。

XRWebGLBinding binding から、XRCamera camera についてカメラ画像を 取得するには、ユーザーエージェントは次の手順を実行しなければならない:
  1. sessionbindingsession とする。

  2. viewcameraview とする。

  3. viewsessionsession と一致しない場合、InvalidStateError投げ、これらの手順を中止する。

  4. frameviewframe とする。

  5. frameactive ブール値が false の場合、InvalidStateError投げ、これらの手順を中止する。

  6. frameanimationFrame ブール値が false の場合、InvalidStateError投げ、これらの手順を中止する。

  7. contextbindingcontext とする。

  8. camera imagecameracamera image とする。

  9. result を、context 上で作成され、 camera image のデータを含む WebGLTexture とする。 result不透明テクスチャである。

  10. result を返す。

ユーザーエージェントは、バインディングおよびカメラインスタンスをキーとしてキャッシュすることを前提に、getCameraImage(camera) 呼び出しの結果を、メソッドの後続呼び出しに対して返すためにキャッシュしてもよい。ユーザーエージェントは、 キャッシュを使用する場合でも、カメラ画像を取得するアルゴリズムのステップ 6 まで(これを含む)を 実行して初期検証を行わなければならない。このキャッシュが許可されているため、アプリケーションは返された WebGLTexture を読み取り専用として扱うべきである。

注記: キャッシュが許可されるのは、ユーザーエージェントが 返された WebGLTexture の寿命の所有権を保持するため(それが不透明 テクスチャと見なされるため)、また同じ requestAnimationFrame() コールバック内でこのメソッドを複数回呼び出すこと (XRCamera、したがって キャッシュキーの一部として推移的に XRFrame を使用することで保証される)、同じバインディング上での呼び出し (キャッシュキーの一部として XRWebGLBinding を使用することで保証される)が、同一の内容を持つテクスチャになるためである。

WebGLTexturegetCameraImage(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 Compositorblend technique によっては、カメラ画像がユーザーがすでに見ているものと 同じ情報を含むことになり、そのため環境のどの部分がウェブサイトから見えているかについて直接的な フィードバックを提供する。なお、場合によっては、サイトがこの情報を抑制できる可能性がある (たとえばスマートフォン上で、ビュー全体を包含する不透明オブジェクトを描画し、 コンポジターによってレンダリングされる環境を遮蔽する場合など)。

ユーザーエージェントがユーザーの同意を求める要件に加えて、アプリケーション開発者には、 そのユースケースを達成する他の手段がある場合、camera-access 機能を要求しないことが強く推奨される。

5.1. ユーザー体験

上記のとおり、Raw Camera Access API のプライバシー上の影響により、ユーザーエージェントは camera-access 機能が有効なセッションを作成する前に、 ユーザーの同意を求めるべきである。これは複数の方法で実現でき、その一部では ユーザーと直接やり取りする必要がある。

ユーザーと直接やり取りする例には、次のものがある:

  1. どの程度細かい情報をサイトに公開するかをユーザーが選択できる許可プロンプトを表示する。 そのようなプロンプトのモックを以下に示す。

  1. requestSession() 呼び出しにアプリケーションが提供する要求機能および任意機能を持つセッションを作成するために必要な さまざまなレベルのユーザー同意を考慮する、一連の許可プロンプトを表示する。

この仕様の意図は、ユーザーエージェントが、提供したい体験がそれを絶対に必要としない場合に アプリ開発者へ camera-access 機能を要求するよう促さないことを確実にすることである。この機能のプライバシー上の影響により、 ユーザーエージェントは、サイトがカメラ画像へのアクセスを求めるときに追加の摩擦を導入することが許可される。 これにより、アプリケーションが不必要にこの機能を要求しないよう促されることが期待される。

ユーザーエージェントは、強力な機能 "camera" のための powerful feature に対する許可 UI(またはすでにオリジンに付与された許可)の 再利用を検討するべきである。

5.2. プライバシーインジケーター

ユーザーエージェントは、camera-access を持つ XRSession が作成され、まだ ended していない間は常に、プライバシーインジケーターを表示しなければならない。セッション作成後にセッションの 付与された 機能の集合を変更できるようになる場合、インジケーターは、少なくとも camera-access 機能記述子がセッションの 付与された機能の集合含まれている限り 表示されるべきである。

ユーザーに表示されるインジケーターは、デバイスのカメラが使用中であり、サイトがそれにアクセスできることを 伝えるべきである。そのため、ユーザーは、カメラの視野内に入るコンテンツがサイトと共有してもよいものかどうかを 確実にするため、特に注意を払うべきである。これは、録画されることに同意していない傍観者が存在する可能性のある 公共の場では特に当てはまる。

インジケーターの例には、次のものが含まれる(ただしこれらに限定されない):

6. 謝辞

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

適合性

文書の 慣例

適合要件は、 記述的な表明と 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, これは情報提供の注記である。

索引

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

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

参考文献

規範的参考文献

[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC における要件レベルを 示すために用いるキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBGL-2]
Dean Jackson; Jeff Gilbert. WebGL 2.0 仕様. 2017年8月12日. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報的参考文献

[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. URL: https://immersive-web.github.io/webxr/

IDL 索引

partial interface XRView {
  [SameObject] readonly attribute XRCamera? camera;
};

[SecureContext, Exposed=Window]
interface XRCamera {
  readonly attribute unsigned long width;
  readonly attribute unsigned long height;
};

partial interface XRWebGLBinding {
  WebGLTexture? getCameraImage(XRCamera camera);
};

課題索引

返される WebGLTexture について、より多くの情報を指定すべきか? 例: color-renderable か、テクスチャ形式は何か、など。