この記事は 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)
スマホ等で実行すると、次の画像のようになります。スマホの向きに応じて値が変わります。
ステップ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たのしい