Oculus Goは3DoFだったので特にWebXR使いたいシーンはなかったのですが,Oculus QuestでWebXRのReferenceSpaceが欲しくなったので試したときのメモ.
Oculus BrowserのRelease Notesによると,5.4 の時点で WebXR is now available under an experimental feature flag.
とあります.5.4のリリースから半年くらいたった気がするので,そろそろサポート進んでるだろうと思って現状の挙動を確認してみました.
ここでは触れませんが,事前にADBをTCP/IP接続できるようにして,Chromeのリモートデバッグ機能を使うと捗ります.
(2019-07-27追記) Oculus Browser 6.0でChromium 74ベースになりました.なのでこの記事の内容はもう古いです.
Chromiumのバージョンを確認
おもむろにブラウザのURLにchrome://version
と入力.
Oculus Browser: 66.0.3359.203 ...
ちょっと残念な結果になる予感がします...でも最近ブラウザのアップデートが何度かあったし,なんだかんだいっても活発に開発しているはず.
navigator.xr
まだchrome://flags
からWebXR Device APIを有効にする必要がありました.
有効にしてもhttps接続じゃないと undefined
が返ります.最近のChromeだとWebXRはオリジントライアルの対象になってたはずですが,Oculusのブラウザにはそういう気配なはさそう(?)
WebXR Device APIを見ながら試す.WebXR周りはまだ仕様が固まってない上に,どの時期の仕様を実装したのかよくわからないので何度か試す.
XRSession
xr.requestDevice()
とかは生えてないので極端に古い実装じゃななそう.(手元で使ってるTHREE.jsはちょっと古くてrequestDevice()を使うバージョンだったのでここでエラー出た)
let session = await navigator.xr.requestSession("immersive-vr");
// → Uncaught (in promise) TypeError: Failed to execute 'requestSession' on 'XR': cannot convert to dictionary.
よくわからないけど,何かをdictionaryにして欲しいらしい.ちょっと古い仕様を実装してそう.
let session = await navigator.xr.requestSession({mode:"immersive-vr"});
// → XRSession {environmentBlendMode: "opaque", mode: "immersive-vr", outputContext: null, renderState: XRRenderState, …}
Questの表示がVRモードに切り替わった.使えそう.ちなみにimmersive-arはサポートされてなかった(カメラ画像にオーバーレイされたりしたら良い意味でびっくりだったのだけど).
XRSpace
XRReferenceSpaceがほしいのが今回の動機なので,本番はここから.requestReferenceSpaceにも文字列じゃなくてオブジェクトを渡す.
let space = await session.requestReferenceSpace({type:"identity"});
// → XRReferenceSpace {originOffset: XRRigidTransform, onreset: null}
中身は単位行列とゼロベクトルでした.
let boundedSpace = await session.requestReferenceSpace({type:"bounded"});
// → Uncaught (in promise) DOMException: This device does not support the requested reference space type.
残念.Questのガーディアンの情報がboundsGeometryで取れれば夢が広がったのに.
まとめ
- Oculus QuestのWebXRはまだっぽい
- WebVRは普通に使えてます
- 最近ブラウザのUI何度か変わった気がするけどChromiumのバージョンは変わってないっぽい