WebXR ViewerはどうやってARKitをwrapしてるのか
結論: 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デバイス上で見られるようにしている。
トップページ:
WebXR Viewerを起動すると↑のようなトップページが出るが、これらのサンプルのうちWorld Sensingの仕様がどこ探しても無いので実装から探すことにした。
JavaScript側
WebXR ViewerはWebXR APIの殆どをJavaScript側で実装している。
webxr-ios-js
がPolyfillのプロジェクトで、WebXR ViewerはこのPolyfillを https://webxr-ios.webxrexperiments.com/dist/webxr-2.0.js から読み込む。
↑ ネイティブ側でPolyfillのURLを更新したコミット
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
にセットされる。
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))
... あまり意味のある使い方をしていないようだ。
XRMesh
とは何なのか
そもそも
WorldSensingサンプルでは、 XRMesh
オブジェクトとしてシーンデータを受けとっていることになっている。これはPolyfill側では、
XRAnchor
の一種として実装されている。 XRAnchor
はW3Cのドラフトの中にあるが、
XR Viewerに実装されているものとは微妙に違うように見える( anchorSpace
が無い)。
XRMesh
は相当するドラフトも存在せず、WebXR Meshing API Level 1が近そうだが XRMesh
というクラスを規定していない。