2016-08-18 13 views
1

私は、getQuaternionFromVector()を使用して、AndroidのSensor.TYPE_ROTATION_VECTOR融合センサーから四元数を取得します。私は私のRajawaliアプリのカメラを制御するために四元数を使用したいと思います。センサー四元数と三次元カメラ四元数の間の変換方法は?

値(X、W、Y、Z)Iは、センサから取得は、(風景の中に電話、まっすぐ見て)である:

  • ノース:(0.5、0.5、-0.5、0.5)
  • イースト:(0.71、0、-0.71、0)
  • 南:(0.5、-0.5、-0.5、-0.5)
  • ウエスト:(0、0.71、0、0.71)

私はこの値をこれらの正しい値に変換する必要があります:

  • ノース:(1.0、0、0、0)
  • イースト:(0.71、0、0.71、0)
  • 南:(0、0、1、0)
  • ウエスト: (-0.71,0,0.71,0)

いくつかの試行錯誤を通して私は解決策にアプローチしましたが、まだまだ道のりがあります。 Iは第1のY軸に対して90°、およびX軸に対して-90度回転する場合:

Quaternion a = new Quaternion(Vector3.Y, 90); 
a.multiply(q); 
Quaternion b = new Quaternion(Vector3.X, -90); 
b.multiply(a); 

Iが得る値である。

  • ノース:(1、0、0、0)
  • イースト:(0.71、-0.71、0、0)
  • 南:(0、-1、0、0)
  • ウエスト:(0.71、0.71、0、0)

結果は、北は正しい、東は上、西は下、南は上下が逆です。ベアリングがピッチと混ざり合っていることがわかりました(私は、装置のピッチとカメラの方位が変わってしまいました)。

センサクォータニオンを予想されたクォータニオン値と一致するように変更する方法についてのご意見はありますか?センサベアリングがカメラのベアリングを変化させ、ピッチを変化させないように、どうやって変更できますか?

ありがとうございます!

答えて

0

管理してください。

public static Quaternion transform(Quaternion q) { 
    Quaternion a = new Quaternion(Vector3.Y, 90).multiply(q); 
    Quaternion b = new Quaternion(a.w, a.y, -a.x, -a.z); 
    return b.multiply(new Quaternion(Vector3.Y, 90)); 
} 
関連する問題