1. イントロダクション
仮想現実(VR)および拡張現実(AR)アプリケーションを可能にするハードウェアは、現在、消費者が広く利用できるようになり、没入型の計算プラットフォームとして新たな機会と課題を提供しています。没入型ハードウェアと直接インタラクションできる能力は、ウェブがこの環境の中で第一級の市民として機能するために不可欠です。WebXR拡張現実モジュールは、開発者がARハードウェア上でコードを実行する際に利用可能な機能を拡張します。
1.1. 用語
Augmented Realityは、仮想コンテンツが現実世界の 環境と位置合わせされ、合成されたXR体験の一分類を指します。XRハードウェアは、表示技術に基づいて分類できます:加算型ライト、パススルー、および不透明。
加算型ライト表示技術を持つデバイス、別名「シースルー」は、半透明の光学ディスプレイを使用して仮想コンテンツを提示します。これらのデバイスでは、ユーザーは常に 現実世界の 環境をセッション作成時に開発者の要求に関係なく見ることができます。
注: このようなデバイスは通常ソフトウェアでコンポジット処理を行わず、半透明ディスプレイによる自然な合成に依存します。
パススルー表示技術を持つデバイスは、不透明ディスプレイを利用し仮想コンテンツと 現実世界の環境のカメラ映像を合成します。これらのデバイスでは、現実世界の 環境は、開発者がセッション作成時に明示的に要求した場合のみ表示されます。
注: この種のデバイスは通常カメラを介して現実世界の画像を収集し、ARシーンとソフトウェアで合成してユーザーに表示します。
不透明 表示技術を持つデバイスは、現実世界の環境を完全に隠し、現実世界の環境を表示する方法を提供しません。
注: このようなデバイスは通常VRデバイスで、ARコンテンツの互換性パスを提供する目的で"immersive-ar"
セッションを許可しています。
2. WebXR デバイスAPI統合
2.1. XRSessionMode
WebXR デバイス APIはXRSessionをXRSessionModeに基づいて分類しています。このモジュールにより、"immersive-ar"
XRSessionMode
列挙型の利用が可能です。
"immersive-ar"セッションモードは、セッションの出力が排他的アクセスを没入型XR
デバイスディスプレイに与え、コンテンツがブレンドされて現実世界の環境と共に表示されることを示します。
対応ハードウェアでは、ユーザーエージェントは"immersive-vr"や"immersive-ar"セッション、または両方をサポートできます。追加の"immersive-ar"セッションモードをサポートしても、ユーザーエージェントが"inline"セッションをサポートする要件は変わりません。
注:これは"immersive-ar"
セッションが"immersive-vr"セッションと同じ機能やリファレンス空間をサポートすることを意味します。両方とも没入型セッションであるためです。
"immersive-ar"
セッションがサポートされているかを確認します。
navigator. xr. isSessionSupported( 'immersive-ar' ). then(( supported) => { if ( ! supported) { return ; } // 'immersive-ar' セッションはサポートされています。 // ページはユーザーにARサポートを告知すべきです。 }
"immersive-ar"
XRSession
を取得しようとします。
let xrSession; navigator. xr. requestSession( "immersive-ar" ). then(( session) => { xrSession= session; });
2.2. XREnvironmentBlendMode
XRコンテンツを描画する際、XR合成エンジンが現実世界の環境とピクセルをどのようにブレンドするかを理解することが有用です。enum {XREnvironmentBlendMode "opaque" ,"alpha-blend" ,"additive" };partial interface XRSession { // Attributesreadonly attribute XREnvironmentBlendMode environmentBlendMode ; };
environmentBlendMode属性は、XREnvironmentBlendMode
の値を報告し、現在XR合成エンジンが実行しているブレンド技法に一致します。
-
alpha-blendブレンドモードは、XR合成エンジンが アルファブレンド環境ブレンドを使用している場合に報告する必要があります。
2.3. XRInteractionMode
アプリケーションがユーザーとインタラクション可能なUIを描画したい場合があります。WebXRは、手持ち型フォンARやヘッドマウント型ARなど多様なフォームファクターに対応しています。フォームファクターによってUIの描画空間が異なり、円滑なインタラクションのためには、たとえば手持ち型フォンARのUIは通常スクリーン上に直接描画されますが、ヘッドマウント型ARのUIは頭から少し離れた位置に描画され、ユーザーがコントローラーで操作できるようにします。
enum {XRInteractionMode ,"screen-space" , };"world-space" partial interface XRSession { // Attributesreadonly attribute XRInteractionMode interactionMode ; };
interactionMode属性は、アプリケーションが現在のセッション用にインタラクティブなUIを描画するのに最適な空間(ユーザーエージェントによる判定)を示します。
-
interactionMode値が"screen-space"の場合、UIは投影せずに直接スクリーンに描画します。通常このシナリオでは、selectイベントは、inputSourceのtargetRayModeが"screen"となります。 -
interactionMode値が"world-space"の場合、UIはユーザーから少し離れた世界空間に描画され、コントローラーで操作できます。通常このシナリオではselectイベントは、inputSourceのtargetRayModeは、"tracked-pointer"または"gaze"となります。
注: WebXR DOM Overlaysモジュールがサポートされていれば、一部の場合に使用可能です。
2.4. XR合成エンジンの動作
コンテンツを XRデバイスに提示する際、XR合成エンジンは、仮想ピクセルと現実世界の環境を組み合わせる適切なブレンド技法を適用しなければなりません。適切な技法は、XRデバイスの表示技術とモードに基づきます。
-
不透明環境ブレンドを実行する際には、XR合成エンジンで得られたレンダーバッファは、100%不透明な黒ピクセルのみを含むバッファ上にsource-overブレンド処理されます。合成出力は XRデバイスに提示されます。この技法は、不透明およびパススルーディスプレイで、 モードが
"immersive-vr"または"inline"のとき適用します。 モードが"immersive-ar"のときは適用しません。 -
アルファブレンド環境ブレンドでは、XR合成エンジンで得られたレンダーバッファは、現実世界の環境のピクセル表現上に、各
XRFrameごとに各ビューのtransformに合わせて source-overブレンドされます。合成出力は XRデバイスに提示されます。この技法は、パススルーディスプレイで、 モードが"immersive-ar"のとき適用します。 モードが"immersive-vr"または"inline"のときは適用しません。 -
加算法環境ブレンドでは、XR合成エンジンで得られたレンダーバッファはlighterブレンドで合成され、XRデバイスに表示されます。 この技法は、加算型ライトディスプレイで、 モードに関係なく適用します。
注: アルファブレンド環境ブレンドを行うデバイスで、アルファチャンネル無しのbaseLayerを使うと、
現実世界の環境が完全に隠されます。これは開発者の意図と見なされ、ユーザーエージェントは
現実世界の環境の合成を最適化のため一時停止する場合があります。
XR合成エンジンは、体験最適化のために追加の色やピクセル調整を行う場合があります。合成のタイミングは、ブレンド技法や 現実世界の環境のソースに依存してはなりません。ただし、ピクセルの深度と現実世界のジオメトリによるオクルージョン処理を行ってはならず、レンダリングされたコンテンツのみが現実世界の背景上に合成されます。
注: 将来のモジュールで、 現実世界の環境との自動または手動によるピクセルオクルージョンが可能になる場合があります。
XR合成エンジンは、カメラインストリンシクスやメディアストリーム、現実世界のジオメトリ等の追加情報へのアクセスについて、ページに自動的に権限を与えてはなりません。
注: 開発者は、既存のMedia Capture and
Streams仕様を通じてXR
デバイスのカメラにアクセスする要求は可能ですが、これにはXRRigidTransformでカメラの位置と
ネイティブ原点の間の情報を問合せる仕組みはありません。また、
現実世界の環境のビューと一致するために必要なカメラインストリンシクスを取得する方法も保証されません。そのため、効果的なコンピュータビジョンアルゴリズムの実行は大きく制限されます。今後のモジュールや仕様でその機能が追加される場合があります。
2.5. 一人称オブザーバービュー
多くのARデバイスにはカメラが搭載されていますが、カメラは通常目と一致していません。セッションの映像をストリーミングやファイル保存のためにキャプチャする際、カメラ映像を単純にレンダリングされた目の映像と合成するだけでは内部オフセットが生じ最適ではありません。デバイスによってはリプロジェクションなどの工夫を行うことがありますが、セカンダリビュー、すなわち
一人称オブザーバービューを公開する場合があり、このビューのeyeは"none"です。
サイトのコンテンツは、"secondary-views" 機能記述子を有効化することで、一人称オブザーバービューの受け取りを明示的に選択する必要があります。
一人称オブザーバービューに対応したセッションで"secondary-views"機能を有効化しても、セッションのすべてのフレームで無条件に一人称オブザーバービューが有効になるわけではなく、キャプチャが行われているフレーム時のみ、そのビューがviews配列に公開されます。
XRSession
のenvironmentBlendModeによりブレンド技法が公開されている場合でも、一人称オブザーバービューは常にアルファブレンド環境ブレンドを使用します。
サイトのコンテンツは、どのビューが一人称オブザーバービューかを知って、異なるブレンド技法への対応やUI要素の描画方法を変えることができます。 XRView
オブジェクトで一人称オブザーバービューに該当するものは、isFirstPersonObserver属性がtrueを返します。
partial interface XRView {readonly attribute boolean ; };isFirstPersonObserver
-
requestSession()のオプション機能として`"secondary-views"`を指定する -
viewsを最初の2要素だけでなく繰り返し処理することを保証する
let session= await navigator. xr. requestSession( "immersive-ar" , { optionalFeatures: [ "secondary-views" ]}); let space= await session. requestReferenceSpace( "local" ); // 他のセットアップを行う let gl= /* グラフィックスコンテキストを取得する */ ; session. requestAnimationFrame( function ( frame) { let views= frame. getViewerPose( space); // 重要: ここでは`view of views`を使う // 最初の2つや3つの要素だけ直接参照しない for ( viewof views) { render( session, gl, view); } }); function render( session, gl, view) { // viewに対してコンテンツをレンダリングする // 必要があればview.isFirstPersonObserverを使って // 合成情報を区別する }
3. プライバシーとセキュリティに関する考慮事項
ARモジュールの実装は、カメラ画像をコンテンツに公開せず、XR合成エンジンで独自実装として現実世界との合成処理を行う必要があります。 このモジュールのさらなる拡張で現実世界の情報(生カメラフレームやライティング推定など)を公開する場合でも、ユーザー同意が必要な追加 機能記述子によって制御しなければなりません。
WebXR Device API拡張との比較において、ARモジュールはenvironmentBlendMode、
interactionMode
属性を通じて、実行されているデバイスの性質に関するいくつかの追加情報のみを提供します。ウェブサイトはXRセッションを"immersive-ar"
として開始でき、XRシーンの背後で現実世界とブレンドする動作となります。
このモジュールによってウェブサイトがカメラ画像にアクセスできなくても、エンドユーザーにはわかりにくい場合があるため、ユーザーエージェントは明示することを推奨します。
変更履歴
2019年10月10日「First Public Working Draft」からの変更点
-
プライバシーとセキュリティに関する考慮事項を追加 (GitHub #49, GitHub #63)
-
用語の明確化 (GitHub #63)
-
一人称オブザーバービューを追加 (GitHub #57)
-
XRInteractionSpaceをXRInteractionModeに名称変更 (GitHub #52)
-
XRInteractionSpaceを追加 (GitHub #50)
4. 謝辞
以下の方々がWebXR Device API仕様の設計に貢献しています:
そして、この全ての冒険に火をつけてくれたVladimir Vukicevic (Unity)に特に感謝いたします!