Open4

WebXR ViewerはどうやってARKitをwrapしてるのか

okuokuokuoku

結論: WebXRのARは現状まだあんまり完成していない。そもそもARKit(= iOS)がMeshでARCore(= Android)がDepthって段階で、オブジェクトを背景で隠すことさえ実装できない。。

というかWebXR ViewerってFirefox Realityと一緒にリストラされてたのか。。

Finally, for iOS users, the WebXR Viewer will remain available, but not continue to be maintained.


MozillaのWebXR ViewerはiOS版FirefoxにWebXR機能を追加し、WebXRコンテンツをiOSデバイス上で見られるようにしている。

トップページ:

https://webxr-ios.webxrexperiments.com/splash.html

WebXR Viewerを起動すると↑のようなトップページが出るが、これらのサンプルのうちWorld Sensingの仕様がどこ探しても無いので実装から探すことにした。

okuokuokuoku

JavaScript側

WebXR ViewerはWebXR APIの殆どをJavaScript側で実装している。

https://github.com/MozillaReality/webxr-ios-js/blob/0b11d76a40b6fd350c4e8bd430b903e3262421b9/src/arkit/ARKitWrapper.js

webxr-ios-js がPolyfillのプロジェクトで、WebXR ViewerはこのPolyfillを https://webxr-ios.webxrexperiments.com/dist/webxr-2.0.js から読み込む。

https://github.com/mozilla-mobile/firefox-ios/commit/bdc989b692bf9d03cace25b7e7ed16d0dc1e0009#diff-0245cd17e421c32b1b43a7650b4915db51305407ba64872399960c24d1218d1aR495

↑ ネイティブ側でPolyfillのURLを更新したコミット

okuokuokuoku

worldSensing Featureを追う

WorldSensing サンプルでは、featureとして worldSensing を要求している。これはどのW3Cプロポーサルにもないので、WebXR Viewerの独自拡張と見られる。

JavaScript 側

navigator.xr.requestSession('immersive-ar', {requiredFeatures: ['hit-test', 'worldSensing']})
	.then(xrSession => {
		initSession(xrSession);
		goButton.innerText = 'End';
	}).catch(err => {
		console.error('Session setup error', err);
	});

これはPolyfill内で ARKitOptions にセットされる。

https://github.com/MozillaReality/webxr-ios-js/blob/0b11d76a40b6fd350c4e8bd430b903e3262421b9/src/arkit/ARKitDevice.js#L395

ARKitOptions.worldSensing = true;

このオプションは watch 手続きに渡される。

this._requestedPermissions.worldAccess = newOptions.worldSensing;

これは userGrantedWorldSensingData で更新される。

		window['userGrantedWorldSensingData'] = (detail) => {
			this._sessionWorldAccess |= detail.granted;
		};

Swift側

Swift側はiOS版Firefoxの webxr ブランチにある。 ...検索しづらいからforkにして欲しい。。

let WEB_AR_IOS_USER_GRANTED_WORLD_SENSING_DATA = "userGrantedWorldSensingData"

WEB_AR_IOS_USER_GRANTED_WORLD_SENSING_DATA の呼出しは、

callWebMethod(WEB_AR_IOS_USER_GRANTED_WORLD_SENSING_DATA, paramJSON: ["granted": true], webCompletion: debugCompletion(name: WEB_AR_IOS_USER_GRANTED_WORLD_SENSING_DATA))

... あまり意味のある使い方をしていないようだ。

okuokuokuoku

そもそも XRMesh とは何なのか

WorldSensingサンプルでは、 XRMesh オブジェクトとしてシーンデータを受けとっていることになっている。これはPolyfill側では、

XRAnchor の一種として実装されている。 XRAnchor はW3Cのドラフトの中にあるが、

XR Viewerに実装されているものとは微妙に違うように見える( anchorSpace が無い)。

XRMesh は相当するドラフトも存在せず、WebXR Meshing API Level 1が近そうだが XRMesh というクラスを規定していない。

https://cabanier.github.io/real-world-geometry/webxrmeshing-1.html