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)
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:
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:
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)
if ScreenRotation = 0 degree
Pitch axis = -orientationAxisX = rotationAxisX
Roll axis = orientationAxisY = rotationAxisY
Yaw axis = orientationAxisZ = -rotationAxisZ
OriginalL'auteur | 2013-09-13
Vous devez vous connecter pour publier un commentaire.
Pour achever le passage des branches, j'ai juste essayer de penser à la suite de la remapCoordinateSystem méthode javadoc:
Afin de prendre votre dispositif de rotation à partir de son orientation naturelle (90, 180 ou 270 degrés), et demandez-vous: Le X positif de l'axe dans le dispositif d'origine de l'orientation de l'axe qui correspond à l'actuel dispositif d'orientation?. Et de même pour l'axe des Y.
Donc, dans le cas où votre appareil est tourné de 90 degrés, vous verrez que l'original X positif de l'axe correspond à l'actuel positif de l'axe Y et l'original positif de l'axe Y correspond à l'orientation actuelle négatif de l'axe X.
De sorte qu'Il devrait être:
Qui a fonctionné pour moi, l'espoir qui aide.
Je suis venu avec cette façon indépendante, de sorte qu'il doit être correcte. Avoir un upvote 😉
Fonctionne très bien lorsque vous utilisez le téléphone à plat sur le sol, si vous avez besoin de valeurs pour lors de la recherche par le biais de la caméra (AR), vous avez uniquement besoin de axisX = SensorManager.AXIS_X; axisY = SensorManager.AXIS_Z; et ensuite ajouter la rotation de la troisième valeur
Tu veux dire l'utilisation des AR-je ajouter screenRotation à
axisZ = SensorManager.AXIS_Y
? Donc, si l'écran est tourné, l'azimut et la hauteur de décrochage être encore en bon appareil photo(AR)-position?J'ai publié une nouvelle réponse avec une description plus détaillée pour l'AR
OriginalL'auteur keianhzo
Grâce keianhzo, votre réponse fonctionne très bien avec les téléphones à plat sur le sol. Pour AR-applications où vous regardez, par l'intermédiaire de l'affichage, j'ai trouvé que cela fonctionne:
utiliser le bon axe:
Obtenir l'orientation degrés:
OriginalL'auteur Björn Kechel
C'est la façon dont je fais de la magie dans ma demande:
votre magie est meilleur, mais la strat de 0 à 180 - 180 à 0
OriginalL'auteur Orka
Si le téléphone de l'INTERFACE utilisateur verrouillé à la rotation de 0, j'obtiens les valeurs suivantes sans
remapCoordinateSystem()
Si le téléphone de l'INTERFACE utilisateur forcé de rotation de 90:
Lacet valeur a -90 degrés ( - PI/2 ) à old orientation!!! => je vais aller à l'Est, dans la réalité au lieu de au Nord.
Si je prends le téléphone pour 0,0,0 position:
Si le téléphone de l'INTERFACE utilisateur forcé de rotation de 180:
Lacet valeur a +/-180 degrés ( +/- PI ) à l'ancien de l'orientation!!! => je vais aller au Sud, dans la réalité au lieu de au Nord.
Si je prends le téléphone pour 0,0,0 position:
Si le téléphone de l'INTERFACE utilisateur forcé de rotation de 270:
Lacet valeur a +de 90 degrés ( + PI/2 ) à vieux orientation!!! => je vais aller à l'Ouest dans la réalité au lieu de au Nord.
Si je prends le téléphone pour 0,0,0 position:
J'ai écrit un petit correctif, et testé avec:
android:screenOrientation="fullSensor"
Dans la plupart des cas est le travail.
Lorsque vous faites pivoter rapidement de 180 degrés autour de l'axe 1, que le système sera vissé!
Le code complet disponible sur Github
OriginalL'auteur
Ce que je fais est
pour remapper les coordonnées en fonction de la caméra (AR), comme suggéré dans la documentation
Jusqu'à présent, j'espère que ça fonctionne bien!
OriginalL'auteur Berťák