研究でJava3d+加速度センサを使っているので、そのテクニックをちょっと記してみようと思います。
(常識であることが多いです。当たり前の確認としてみてください。)
てか、自分の議事録用だからまぁなんでもいいですよね。
一番初めに、軸の指定ですが、
加速度センサの話をする際、
上下(重力方向)をZ、奥行きをX、左右をYとして話をしています。
実際にJava3dで扱う際は、表示にもよりますが基本
上下がY、奥行きをZ、左右をXとして数学の座標系を扱うようです。
今回は加速度センサの話なので、上を使いました。プログラムに起こす際は気をつけましょう。
まず使用。
自分が愛用しているセンサは こちら です。
使用は、本体から3軸に向けた加速度が取得できます。
取得できる値に関して、簡単なイメージですが、
基本状態だとこんな感じで、角軸に加速度がかかっています。
停止しているときは、重力加速度1G分がZ方向に加わるので、センサはZに1を示すはずです。
それを横(Z軸)に若干回転したのち、Y軸に若干回転すると以下の図になります。
まぁなんとなくこんな感じで、加速度センサに表示される数値は
停止しているときは、重力加速度の分解値になるわけですね。
と、いうことは
停止時にこのセンサ値を何とかすると、加速度センサの傾きが検出できるのではないか?
ということにはまぁ、みなさんなりますよね。当たり前ですよね。
はい。ということでやってみましょう。
と、言いたいところですが、
残念ながらできません。
なぜかというと、Z軸に関する回転がとれないからです。
(図中のZ軸とは上下に伸びる線、すなわち、重力がかかる方向を指します。)
たとえば、初期の状態(図1)だと、センサの値はZに1です。さっきも言いました。
ですが、Z軸に対してπ/8回転してみましょう。
こ、これは。
横方向に開店したところで、センサの検出値はZに1のままなのです。
結局センサ自体の状態は変わっていないから当たり前ですが。
すなわち、この方向の回転は加速度センサだけではさばききれないというわけです。
はい。前置きはここまでで、実際何ができるの?
1、傾斜器ができます。
1軸に対する傾斜器は、簡単で、横から見た図を思い浮かべましょう。
こんな感じで、θだけ傾けた場合を考えます。
この状態で停止していると、黄色ベクトルのように地面方向に1Gの加速度がかかっているので
センサはX、Yにピンクベクトルのように値を示します。
元の大きさが1Gだとすると、自然と
X=1*sinθ Y=1*cosθ
と、なります。
X、Yの値が検出されるということなので、逆に
θ=arcSinX となるわけです。
こう考えるとセンサの状態を角度で取得するのは(1軸だけならば)簡単で、
検出された値をarcSinするだけになります。
したがって計算したθの値を、Java3Dなどでオブジェクトに反映させることで
1軸だけならば、加速度センサの状態と、表示するオブジェクトの状態を対応させることが可能となるわけです。
たとえば加速度センサをくるくる回すと、表示されているオブジェクトもくるくる回るみたいな。
θが計算できるので、もちろん加速度センサの角度を数値で取得することも可能となります。
以上。