Android SensorManager étrange comment remapCoordinateSystem

API Démos -> Graphiques -> Compas

Il ne fonctionne correctement que, jusqu'à ce que vous ne modifiez pas l'appareil orientation naturelle.
Dans la plupart des téléphones, est le portrait et plus de 10 pouces comprimés sont le paysage. Si vous changez de besoin de tourner cela à 90 degrés. Je voudrais voir une 3D correctif pour ce système.

Sûr à 100% besoin d'utiliser remapCoordinateSystem() méthode.

Je voudrais voir comment ( le code), si je pouvais voir une explication avec la façon dont est calculé ces axes de cartographie ( théorique et en mathématiques ) ce serait sympa.

J'ai essayé de comprendre, mais j'ai tout oublié à l'algèbre linéaire.

Ici il est dit pourquoi devons-nous utiliser, mais ne dites pas comment!

float R[] = new float[9];
//X  (product of Y and Z) and roughly points East
//Y: points to Magnetic NORTH and tangential to ground
//Z: points to SKY and perpendicular to ground
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);

Il semble que ces coordonnées sont à ce poste: - le dispositif de dire dans un tableau (x et y des axes sont sur la table)

Android SensorManager étrange comment remapCoordinateSystem

Si, et seulement si

getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_0

La question est de savoir comment remplir ce code: - les branches

switch (mScreenRotation) {
    case Surface.ROTATION_0:
    Log.v("SurfaceRemap", "0 degree");
    axisX = SensorManager.AXIS_X;//is this valid?
    axisY = SensorManager.AXIS_Y;//is this valid?
    break;

    case Surface.ROTATION_90:
    Log.v("SurfaceRemap", "90 degree");
    //examples says remapCoordinateSystem(inR, AXIS_Y, AXIS_MINUS_X, outR);
    axisX = SensorManager.AXIS_Y;
    axisY = SensorManager.AXIS_MINUS_X;
    break;

    case Surface.ROTATION_180:
    Log.v("SurfaceRemap", "180 degree");
    break;

    case Surface.ROTATION_270:
    Log.v("SurfaceRemap", "270 degree");
    break;

    default:
    Log.v("SurfaceRemap", "don't know the mScreenRotation value: "+mScreenRotation+" you should never seen this message!");
    break;
}


boolean remapped = SensorManager.remapCoordinateSystem(R, axisX, axisY, R);

float orientation[] = new float[3];

SensorManager.getOrientation(R, orientation);//All three angles above are in radians and positive in the counter-clockwise direction.
inclination = SensorManager.getInclination(I);

Edit:
J'ai écrit une petite application de test, où sur l'écran, il affiche un écran de rotation: 0, 90, 270 degrés ( ne peut pas faire de 180 maintenant)

Il me semble, si la Rotation de 0 est inchangé (axisX = SensorManager.AXIS_X;axisY = SensorManager.AXIS_Y;) de 90 degrés doit être:

axisX = SensorManager.AXIS_MINUS_Y;
axisY = SensorManager.AXIS_X;

que Google documentation dit quelque part des valeurs erronées! La Question est où?!

getRotationMatrix retour à ceci:

Android SensorManager étrange comment remapCoordinateSystem

X est défini comme le produit vectoriel Y. Z (Il est tangent à la terre à l'appareil de l'emplacement actuel et à peu près vers l'Est).

Y est tangent à la terre à l'appareil de l'emplacement actuel et des points vers le Pôle Nord magnétique.

Z pointe vers le ciel et est perpendiculaire au sol.

Voir le téléphone ci-dessus! J'ai envie de de droite, de gauche, avec la caméra arrière à la terre.

getOrientation retour à ceci:

Android SensorManager étrange comment remapCoordinateSystem

X est défini comme le produit vectoriel Y. Z (Il est tangent à la terre à l'appareil de l'emplacement actuel et à peu près l'Ouest).

Y est tangent à la terre à l'appareil de l'emplacement actuel et des points vers le
Pôle Nord magnétique.

Z pointe vers le centre de la Terre et est perpendiculaire au sol.

values[0]: l'azimut, la rotation autour de l'axe Z.

values[1]: la hauteur, la rotation autour de l'axe X.

values[2]: rouleau, la rotation autour de l'axe Y.

Comment doit être le téléphone?

Enfin, je voudrais avoir des valeurs d'angles comme des avions. Mon téléphone (me) en direction du Nord: (lacet est l'azimut)

Android SensorManager étrange comment remapCoordinateSystem

              if ScreenRotation = 0 degree
Pitch axis = -orientationAxisX  =  rotationAxisX
Roll axis  =  orientationAxisY  =  rotationAxisY 
Yaw axis   =  orientationAxisZ  = -rotationAxisZ

OriginalL'auteur | 2013-09-13