傾きセンサーの利用

本日の収穫は、

  • 傾きセンサーの値の取り扱い方がつかめてきた

と言ったところだ.

ポイントは、

1. 傾きセンサー(重力加速度センサー)の値を球面上の法線ベクトルとして捉える
2. 方位と強さの分解する(法線ベクトルの正規化)
3. 極を決めて、接ベクトルと従法線ベクトルを求める
4.上で求めた基準の座標系を使って基準位置から相対的な傾きを求めることができる

と、いった感じになるだろう.

こういった取り扱いができることで、端末の傾きを座標系として捉えることができると言うのが利点.

わかってしまうと当たり前のことなんだけれども、方向ベクトルとしてしか捉えていなかった値を座標系として考えられるってのは目から鱗ものだった.

軽く注釈をいれると

『1. 傾きセンサー(重力加速度センサー)の値を球面上の法線ベクトルとして捉える』

端末が球面上に張り付いているイメージ.
どんな方向に端末が傾こうが、X,Y,Zの軸は互に直行する関係にある.
(端末は歪まないのであたりまえ)

『2. 方位と強さの分解する(法線ベクトルの正規化)』

センサーの値を法線ベクトルとして捉えるための前準備.
正規化したベクトルは、X軸だろうが、Y,Z軸だろうが、自分で取り扱いやすい軸に見立てればよい.

『3. 極を決めて、接ベクトルと従法線ベクトルを求める』

恐らく、コンテンツによって極をどこで取るのが都合が良いのか決まる.
極とか接ベクトルとかいう言葉を使うとややこしいけど、要はワールドのY軸(0,1,0)でもX軸(1,0,0)でも1軸基準を決めてしまえば、基準のベクトルと法線ベクトルの外積で接ベクトルが求まる.
接ベクトルと法線ベクトルの外積で従法線ベクトルが求まる.
ま、すなわちLookAtと同じ要領だね.

『4.上で求めた基準の座標系を使って基準位置から相対的な傾きを求めることができる』

当然空間上の位置なんかはわからんので、3軸をつかって3*3行列が手に入るだけ.
この行列を基準の座標系として、実際に利用したい加速度のベクトルをこの逆行列で変換すれば基準姿勢からの傾きが扱いやすい.

たぶん傾きセンサーを使う時のデザインパターンと言っていいと思う.

ただしこの手法には、極を勝手に決めてしまったので特異点ができてしまうと言う欠点がある.

例えば極をY軸(0,1,0)と置いた時、外積から(接|従)ベクトルを求めるので加速度が(0,1,0)もしくは(0,-1,0)のとき(接|従)ベクトルを求めることが出来なくなってしまう
コンテンツの内容にもよるのだろうけど、そこまでぐるぐると端末を回すコンテンツも少ないだろうから極の取り方さえ間違えなければ十分に使い道があると感じた.