Données du capteur et orientation de l’affichage (HTML)
[ Cet article est destiné aux développeurs de Windows 8.x et Windows Phone 8.x qui créent des applications Windows Runtime. Si vous développez une application pour Windows 10, voir la Documentation ]
Les données du capteur provenant des classes Accelerometer, Gyrometer, Compass, Inclinometer et OrientationSensor sont définies par leurs axes de référence. Ces axes sont définis par l’orientation de l’appareil et pivotent avec l’appareil à mesure que l’utilisateur le fait tourner. Si votre application prend en charge la rotation automatique (c’est-à-dire qu’elle se réoriente pour s’adapter à l’appareil à mesure que l’utilisateur le fait pivoter), vous devez ajuster vos données du capteur relatives à la rotation avant de l’utiliser.
Orientation de l’affichage contre orientation de l’appareil
Pour comprendre les axes de référence pour les capteurs, vous devez distinguer l’orientation de l’affichage de l’orientation de l’appareil. L’orientation de l’affichage correspond au sens dans lequel le texte et les images sont affichés à l’écran, alors que l’orientation de l’appareil correspond au positionnement physique de l’appareil. Sur l’image suivante, l’orientation de l’affichage et celle de l’appareil ont la valeur Landscape.
L’image suivante montre l’orientation de l’affichage et de l’appareil en mode LandscapeFlipped.
L’image suivante montre l’orientation d’affichage en mode Landscape tandis que l’orientation de l’appareil est en mode LandscapeFlipped.
Vous pouvez effectuer une requête sur les valeurs d’orientation par l’intermédiaire de la classe DisplayInformation à l’aide de la méthode GetForCurrentView avec la propriété CurrentOrientation. Vous pouvez ensuite créer une logique en comparant ces valeurs avec l’énumération DisplayOrientations. Souvenez-vous que, pour chaque orientation que vous prenez en charge, vous devez prendre en charge une conversion des axes de référence dans cette orientation.
Appareils à priorité Paysage ou à priorité Portrait
Les fabricants produisent maintenant des appareils à priorité Paysage ou Portrait. Quand ils intègrent des composants dans des appareils, ils le font de manière cohérente et unifiée pour que tous les appareils opèrent dans le même cadre de référence. Le tableau suivant montre les axes de capteur pour les appareils à priorité Paysage et Portrait.
Orientation | Priorité Paysage | Priorité Portrait |
Landscape |
||
Portrait |
||
LandscapeFlipped |
||
PortraitFlipped |
Orientation de l’affichage et orientation de la boussole
L’orientation de la boussole dépend des axes de référence. Elle change donc avec l’orientation de l’appareil. Vous compensez en vous appuyant sur le tableau suivant (en supposant que l’utilisateur est orienté au nord).
Orientation de l’affichage | Axe de référence pour l’orientation de la boussole | Orientation de la boussole de l’API avec une orientation au nord | Compensation de l’orientation de la boussole |
---|---|---|---|
Landscape |
-Z |
0 |
Orientation |
Portrait |
Y |
90 |
(Orientation + 270) % 360 |
LandscapeFlipped |
Z |
180 |
(Orientation + 180) % 360 |
PortraitFlipped |
Y |
270 |
(Orientation + 90) % 360 |
Modifiez l’orientation de la boussole tel qu’indiqué dans le tableau pour afficher correctement l’orientation, comme illustré ici.
function readingChanged(e) {
var heading = e.reading.headingMagneticNorth;
var displayOffset;
// Calculate the compass heading offset based on
// the current display orientation.
var displayInfo = Windows.Graphics.Display.DisplayInformation.getForCurrentView();
switch (displayInfo.currentOrientation) {
case Windows.Graphics.Display.DisplayOrientations.landscape:
displayOffset = 0;
break;
case Windows.Graphics.Display.DisplayOrientations.portrait:
displayOffset = 270;
break;
case Windows.Graphics.Display.DisplayOrientations.landscapeFlipped:
displayOffset = 180;
break;
case Windows.Graphics.Display.DisplayOrientations.portraitFlipped:
displayOffset = 90;
break;
}
var displayCompensatedHeading = (heading + displayOffset) % 360;
// Update the UI...
}
Orientation de l’affichage avec l’accéléromètre et le gyromètre
Le tableau suivant convertit les données de l’accéléromètre et du gyromètre pour obtenir l’orientation de l’affichage.
Axes de référence | X | Y | Z |
---|---|---|---|
Landscape |
X |
Y |
Z |
Portrait |
Y |
-X |
Z |
LandscapeFlipped |
-X |
-Y |
Z |
PortraitFlipped |
-Y |
X |
Z |
Voici un exemple de code qui applique ces conversions au gyromètre.
function readingChanged(e) {
var reading = e.reading;
var displayOffset;
// Calculate the gyrometer axes based on
// the current display orientation.
var displayInfo = Windows.Graphics.Display.DisplayInformation.getForCurrentView();
switch (displayInfo.currentOrientation) {
case Windows.Graphics.Display.DisplayOrientations.landscape:
x_Axis = reading.angularVelocityX;
y_Axis = reading.angularVelocityY;
z_Axis = reading.angularVelocityZ;
break;
case Windows.Graphics.Display.DisplayOrientations.portrait:
x_Axis = reading.angularVelocityY;
y_Axis = -1 * reading.angularVelocityX;
z_Axis = reading.angularVelocityZ;
break;
case Windows.Graphics.Display.DisplayOrientations.landscapeFlipped:
x_Axis = -1 * reading.angularVelocityX;
y_Axis = -1 * reading.angularVelocityY;
z_Axis = reading.angularVelocityZ;
break;
case Windows.Graphics.Display.DisplayOrientations.portraitFlipped:
x_Axis = -1 * reading.angularVelocityY;
y_Axis = reading.angularVelocityX;
z_Axis = reading.angularVelocityZ;
break;
}
// Update the UI...
}
Orientation de l’affichage et orientation de la boussole
Les données OrientationSensor doivent être modifiées d’une autre façon. Considérez ces différentes orientations comme des rotations dans le sens inverse des aiguilles d’une montre appliquées à l’axe des Z. Nous devons donc inverser la rotation pour revenir à l’orientation de l’utilisateur. Pour les données de quaternion, nous pouvons utiliser la formule d’Euler pour définir une rotation avec un quaternion de référence. Nous pouvons également utiliser une matrice de rotation de référence.
Pour obtenir l’orientation relative souhaitée, multipliez l’objet de référence par l’objet absolu. Notez que cette formule mathématique n’est pas commutative.
Dans l’expression précédente, l’objet absolu est retourné par les données du capteur.
Orientation de l’affichage | Rotation dans le sens inverse des aiguilles d’une montre autour de Z | Quaternion de référence (rotation inverse) | Matrice de rotation de référence (rotation inverse) |
---|---|---|---|
Landscape |
0 |
1 + 0i + 0j + 0k |
[1 0 0 0 1 0 0 0 1] |
Portrait |
90 |
cos(-45⁰) + (i + j + k)*sin(-45⁰) |
[0 1 0 -1 0 0 0 0 1] |
LandscapeFlipped |
180 |
0 - i - j - k |
[1 0 0 0 1 0 0 0 1] |
PortraitFlipped |
270 |
cos(-135⁰) + (i + j + k)*sin(-135⁰) |
[0 -1 0 1 0 0 0 0 1] |