質問: Quaternion.Euler (mag [0], mag [1], mag [2]) * new Vector3 (v[0], v[1], v[2]); vは加速度センサの値を代入し、姿勢角方向に加速度ベクトルの分だけ速度を与える方法を実行してみたのですが、あまり良い挙動になりませんでした。 よろしければまだこういう方法があるなど教えていただけないでしょうか?
回答: 質問から数学と物理のレベルを察するに、 > > 姿勢角方向に加速度ベクトルの分だけ速度を与える > > > と、加速度と速度の違いをあまり理解してないレベルのようなので なかなか教えるの難しいです。 (こうなってくるとmag[]に本当に姿勢角が入っているかも怪しい) 適当に回転させるだけなら以下の2つ方法が。 (以前自分で書いたもの引っ張り出したんで、言語がC#じゃないですし 座標系も多分違うんですが雰囲気だけでも) * 重力方向と地磁気水平成分を算出して適当な基準状態からの姿勢を求める。 ``` // ベクトルはすべて3x1 acc_ = acc / norm(acc) mag_ = mag / norm(mag) down = -acc_ east = cross(down , mag_) east = east / norm(east) north = cross(east , down) north = north/norm(north) dcm = [north , east , down] // 回転行列、[a,b,c]はベクトルを横に並べるという意味 ``` * 角速度を現在の姿勢に作用させ続ける。 ``` // wは角速度 // Tsは時間間隔 // qは姿勢クォータニオン // dqは姿勢クォータニオンの変化量 // q_は変化後のクォータニオン v = norm(w)*Ts q_ = q if v != 0 dq = [sin(v/2)*w/norm(w) ; cos(v/2)] // [a;b]は縦に並べるという意味 q_ = q*dq // クォータニオン積 q_ = q_/norm(q_) // 正規化 end ``` シミュレーション用途じゃなくて、ちょっと面白い入力方法ぐらいの扱いなら 角速度使う方法単体で充分だと思います。 ゲームだからそれっぽく見えればそれでいいと言う発想なら、 なにか他にごまかし方がある気がしますが思いつきませんでした。 ちなみに本当に真面目にやろうとすると こういうの:Quaternion kinematics for the error-state Kalman filterを 読んで「なるほどな」となるレベルじゃないと厳しいです。