2016-08-18 3 views
1

Je reçois un quaternion du capteur fusionné Sensor.TYPE_ROTATION_VECTOR d'Android en utilisant getQuaternionFromVector(). Je veux utiliser ce quaternion pour contrôler la caméra de mon application Rajawali.Comment convertir entre quaternion capteur et quaternion caméra 3D?

Les valeurs (w, x, y, z) I reçoivent du capteur sont (téléphone dans le paysage, regardant droit devant):

  • Nord: (0,5, 0,5, -0,5, 0,5)
  • Est: (0,71, 0, -0,71, 0)
  • Sud: (0,5, -0,5, -0,5, -0,5)
  • Ouest: (0, 0,71, 0, 0,71)

J'ai besoin de transformer ces valeurs à ces valeurs correctes:

  • Nord: (1,0, 0, 0, 0)
  • Est: (0,71, 0, 0,71, 0)
  • Sud: (0, 0, 1, 0)
  • Ouest: (-0.71, 0, 0.71, 0)

Après quelques essais et erreurs, j'ai abordé une solution, mais je suis encore loin. Si je suis une rotation de 90 ° contre l'axe Y, et -90 degrés contre l'axe X:

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

Les valeurs que je reçois sont:

  • Nord: (1, 0, 0, 0)
  • Est: (0,71, -0,71, 0, 0)
  • Sud: (0, -1, 0, 0)
  • Ouest: (0,71, 0,71, 0, 0)

Le résultat est que le nord est correct, l'est est en hausse, l'ouest est en baisse et le sud est à l'envers. Je remarque que le roulement est mélangé avec la hauteur (je change la hauteur de l'appareil et le palier de la caméra change, et les repères).

Des suggestions pour modifier le quaternion du capteur en fonction de la valeur de quaternion attendue? Comment puis-je le changer afin que le palier du capteur change le palier de la caméra et non le diapason?

Merci d'avance!

Répondre

0

Géré pour le trier.

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)); 
}