2020/12/08追記
A-Frame v1.1.0 がリリースされましたね。
最新のA-Frameであれば、こちらの対応は不要になります。
2020/05/18追記
CardboardVRDisplayにこちらの修正が入りましたので、1.0.19を使用していれば動作するようになるかと思います。
A-Frameもこちらのissueの中で変更されてるようですので、次のバージョンがリリースされればこちらの変更は不要になるかと思います。
概要
iOS 13.4.1でA-Frameのvr-modeにしたときに画面に映る映像が変わらない場合の一時対処方法です。
A-FrameというよりもCardboardVRDisplayを使用している場合はこちらが発生しているかと思います。
(A-FrameはWebVR PolyfillからCardboardVRDisplayを使用しています。)
再現環境
- iOS 13.4.1
- A-Frame v1.0.4(バージョンはそれほど関係ないかと思います)
対処方法
以下のような感じの実装を実行すると(とりあえず)動きます
vrDisplayが初期化されたあと(a-sceneのrenderstartなど)で実行してください。
(CardboardVRDisplayを取得して、FusionSensorをいじっているだけですので、CardboardVRDisplayをそのまま使用している場合は少し置き換えれば動くかと思われます)
私のiPhone 11 Pro(13.4.1)だと動いてますが、動かなかったらすみませんmm
// iOS 13.4.1の判定については色々とあると思いますので、省略です。
const vrDisplay = AFRAME.utils.device.getVRDisplay()
if (!vrDisplay || !vrDisplay.poseSensor_ || !vrDisplay.poseSensor_.fusionSensor) return
const fusionSensor = vrDisplay.poseSensor_.fusionSensor
fusionSensor.stop()
fusionSensor.isWithoutDeviceMotion = true
fusionSensor.start()
何が起こっているかのメモ的な何か
なんで動かないの?
iOS 13.4.1のSafariでDeviceMotionEvent.rotationRateがnullで返ってくるため、CardboardVRDisplayのFusionPoseSensor.prototype.updateDeviceMotion_で例外が発生していました。
(おそらく次のバージョンのiOS Safariではもとに戻っているかと思われます。https://bugs.webkit.org/show_bug.cgi?id=209831)
なんでこんな書き方?
FusionPoseSensorのコンストラクタでDeviceMotionを使用するかの判定が行われて、そのままstart()でEventListenerが登録されますので、stop()で削除して、手動でisWithoutDeviceMotionをtrueにしてstart()
することでdeviceorientation
で姿勢制御されます。
vr-modeではないときはなぜ動いているのか
A-Frameはdeviceorientation
を使用しているからです。