Power Apps でスマホの傾きを計算する方法

この記事は FIXER Rookies Advent Calendar 2021 10日目の記事です。

こんにちは、毛利です。この記事では Power Apps でスマホの傾きを得る方法について書きます。イメージとしては水準器アプリが近いと思います。他の使い道としては、スマホの傾きを使うゲームを作るのにも使えると思います。

ステップ1. Acceleration信号で加速度を得る

まずスマホの加速度センサーが計測している値を得ます。これには Acceleration信号 を使います。

使うのですが、ドキュメントの前後上下の意味がわかりづらいです。スマホの画面を基準にした場合、手元のiPhone 8では次のようになり、ドキュメントとはYとZが逆になります。お手持ちのスマホでそれぞれの値が何を指すのか(ステップ1を通して)一度調べたほうが良いかもしれないです。

加速度を得る Power Apps 式値の意味
Acceleration.Xスマホ画面の左右方向の加速度、右辺が上のときにプラス
Acceleration.Yスマホ画面の上下方向の加速度、上辺が上のときにプラス
Acceleration.Zスマホ画面の手前/奥側方向の加速度、前面が上のときにプラス

一旦それぞれの値を見てみましょう。ラベルを追加して、ラベルのTextプロパティの内容を次のようにします。数値を文字列にするのに Text関数 を使っています。

"X = " & Text(Acceleration.X)
"Y = " & Text(Acceleration.Y)
"Z = " & Text(Acceleration.Z)

スマホ等で実行すると、次の画像のようになります。スマホの向きに応じて値が変わります。

Acceleration信号の値を表示

ステップ2. スマホの傾きを計算する

ステップ1で加速度の値を得られるようになりましたが、なじみのある ~度 みたいに表示したほうがわかりやすいので、加速度の値から角度を計算します。

角度の計算には Atan2関数 を使います。Atan2はtanの逆関数に相当しますが、返ってくる範囲が-π/2~π/2ではなく-π~πになります。このおかげで同じ傾きでも向きを判別できます。また、Atan2の結果は弧度法の値で返ってくるので、身近な度数法に直したいと思います。度数法に直すには180を掛けてπで割ると求まります。

これらの点を考慮すると、次のようになります。

"スマホの左辺を接したとき " & Text(Atan2(Acceleration.X, Acceleration.Y) * 180 / Pi(), "#0.000") & " 度傾いている"
"スマホの下辺を接したとき " & Text(Atan2(Acceleration.Y, Acceleration.X) * 180 / Pi(), "#0.000") & " 度傾いている"

カメラ方向に関しては、X軸方向とY軸方向の加速度をまとめた値を計算して、その値とZ方向の加速度でAtan2を取るとうまくできそうです。式中で2回使う値は With関数 を用いるとわかりやすく書けます。With関数は Set関数 と違って、動作の数式 である必要がないので、覚えておくと使える場面がよくあると思います。他のプログラミング言語で言うところの局所変数として使えます。

With(
    {
        x: Acceleration.X,
        y: Acceleration.Y,
        z: Acceleration.Z
    },
    "カメラ方向が地平線の向きから " & Text(Atan2(Sqrt(x*x+y*y), z) * 180 / Pi(), "#0.000") & " 度傾いている"
)

スマホで試してみると、次のようになります。めでたしめでたし。

計算した傾斜角度の表示

おわりに

Atan2たのしい

FIXER Inc. 毛利 真士
  • FIXER Inc. 毛利 真士
  • 三重県出身の毛利真士です
    趣味は競プロ、Rust、サーバ周り、自作言語・コンパイラなどなどです