2014-12-16

iOSとAndroidとの間でDeviceMotionEventの軸の向きが逆

JavaScriptで加速度センサーの値を取得した件ですが、どうもiOSとAndroidとでは加速度の軸の向きが逆みたいなのです。

W3Cではデバイス座標系を定義していて、

  • X軸正方向が端末デフォルト向きに対して右方向
  • Y軸正方向が端末デフォルト向きに対して上方向
  • Z軸正方向が端末デフォルト向きに対して手前方向

となっています。

DeviceMotionEventイベントのaccelerationプロパティやaccelerationIncludingGravityプロパティも当然この座標系に沿って、端末が右へ加速したならxが正の値に増加するというのが普通の解釈だと思います。

しかし、iOSではそうでは無いようです。右、上、手前へ加速するとx、y、zがそれぞれ負の値になります。逆向きに加速すると正の値になります。どうも座標軸の向き自体が逆になっているようなのです。同じChromeでもiOS版とAndroid版とで向きが異なります。これは困りました。

OSを判別してiOSなら向きを反転させるか、または、DeviceOrientationEventで済む事ならそちらを使うようにするのが良いのでしょうね。

そんなわけで、この間作ったスキーゲームも修正しました。傾けた方向とは逆きに動いてしまっていたので。