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.

Orientation de l’affichage et de l’appareil en mode Landscape

L’image suivante montre l’orientation de l’affichage et de l’appareil en mode LandscapeFlipped.

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.

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

Appareil à priorité Paysage en mode d’orientation Landscape Appareil à priorité Portrait en mode d’orientation Landscape

Portrait

Appareil à priorité Paysage en mode d’orientation Portrait Appareil à priorité Portrait en mode d’orientation Portrait

LandscapeFlipped

Appareil à priorité Paysage en mode d’orientation LandscapeFlipped Appareil à priorité Portrait en mode d’orientation LandscapeFlipped

PortraitFlipped

Appareil à priorité Paysage en mode d’orientation PortraitFlipped Appareil à priorité Portrait en mode d’orientation 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.

Formule d’Euler

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.

Multipliez l’objet de référence par l’objet absolu

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]