Partager via


Orientation de capteur

Les données de capteur des classes Accelerometer, Gyrometer, Compass, Inclinometer et OrientationSensor sont définies par leurs axes de référence. Ces axes sont définis par le cadre de référence de l’appareil et pivotent avec l’appareil à mesure que l’utilisateur le transforme. Si votre application prend en charge la rotation automatique et se réoriente pour prendre en charge l’appareil lorsque l’utilisateur le fait pivoter, vous devez ajuster vos données de capteur pour la rotation avant de l’utiliser.

API importantes

Orientation d’affichage et orientation de l’appareil

Pour comprendre les axes de référence des capteurs, vous devez distinguer l’orientation de l’affichage de l’orientation de l’appareil. L’orientation de l’affichage est le texte de direction et les images sont affichées sur l’écran, tandis que l’orientation de l’appareil est le positionnement physique de l’appareil.

Remarque

L’axe z positif s’étend à partir de l’écran de l’appareil, comme indiqué dans l’image suivante. Axe Z pour ordinateur portable

Dans les diagrammes suivants, l’appareil et l’orientation de l’affichage se trouvent dans Paysage (les axes de capteur affichés sont spécifiques à l’orientation paysage).

Ce diagramme montre à la fois l’affichage et l’orientation de l’appareil dans Paysage.

Affichage et orientation de l’appareil dans Paysage

Ce diagramme suivant montre à la fois l’affichage et l’orientation de l’appareil dans LandscapeFlipped.

Affichage et orientation de l’appareil dans LandscapeFlipped

Ce diagramme final montre l’orientation de l’affichage dans Paysage tandis que l’orientation de l’appareil est LandscapeFlipped.

Afficher l’orientation dans Paysage alors que l’orientation de l’appareil est LandscapeFlipped

Vous pouvez interroger les valeurs d’orientation via la classe DisplayInformation à l’aide de la méthode GetForCurrentView avec la propriété CurrentOrientation. Vous pouvez ensuite créer une logique en comparant l’énumération DisplayOrientations . N’oubliez pas que pour chaque orientation que vous prenez en charge, vous devez prendre en charge une conversion des axes de référence vers cette orientation.

Appareils paysage-first et portrait-first

Les fabricants produisent à la fois des appareils paysage et portrait-premier. Le cadre de référence varie entre les appareils paysage(comme les ordinateurs de bureau et les ordinateurs portables) et les appareils portrait-premier (comme les téléphones et certaines tablettes). Le tableau suivant présente les axes de capteur pour les appareils paysage-premier et portrait-first.

Orientation Paysage d’abord Portrait d’abord
Paysage Appareil Paysage d’abord en orientation Paysage Appareil Portrait-first en orientation Paysage
Portrait Appareil Paysage d’abord en orientation Portrait Appareil Portrait-first en orientation Portrait
LandscapeFlipped Appareil Paysage first dans l’orientation PaysageFlipped Appareil Portrait-first dans l’orientation PaysageFlipped
PortraitFlipped Appareil Paysage premier dans l’orientation PortraitFlipped Appareil Portrait-first dans l’orientation PortraitFlipped

Appareils de diffusion d’affichage et d’appareils sans tête

Certains appareils ont la possibilité de diffuser l’affichage sur un autre appareil. Par exemple, vous pouvez prendre une tablette et diffuser l’écran sur un projecteur qui sera en orientation paysage. Dans ce scénario, il est important de garder à l’esprit que l’orientation de l’appareil est basée sur l’appareil d’origine, et non sur celle présentant l’affichage. Ainsi, un accéléromètre signale les données de la tablette.

En outre, certains appareils n’ont pas d’affichage. Avec ces appareils, l’orientation par défaut de ces appareils est portrait.

Afficher l’orientation et le titre de boussole

Le titre de boussole dépend des axes de référence et change donc avec l’orientation de l’appareil. Vous compensez en fonction de cette table (supposons que l’utilisateur est confronté au nord).

Orientation de l’affichage Axe de référence pour le titre de boussole Cap de boussole d’API en face nord (paysage-premier) Tête de boussole d’API en face nord (portrait-premier) Compensation de titre de boussole (paysage-premier) Compensation de titre boussole (portrait-premier)
Paysage Z- 0 270 Direction (Titre + 90) % 360
Portrait Y 90 0 (Titre + 270) % 360 Direction
LandscapeFlipped Z 180 90 (Titre + 180) % 360 (Titre + 270) % 360
PortraitFlipped Y 270 180 (Titre + 90) % 360 (Titre + 180) % 360

Modifiez le titre de boussole comme indiqué dans le tableau pour afficher correctement le titre. L’extrait de code suivant montre comment procéder.

private void ReadingChanged(object sender, CompassReadingChangedEventArgs e)
{
    double heading = e.Reading.HeadingMagneticNorth;
    double displayOffset;

    // Calculate the compass heading offset based on
    // the current display orientation.
    DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();

    switch (displayInfo.CurrentOrientation)
    {
        case DisplayOrientations.Landscape:
            displayOffset = 0;
            break;
        case DisplayOrientations.Portrait:
            displayOffset = 270;
            break;
        case DisplayOrientations.LandscapeFlipped:
            displayOffset = 180;
            break;
        case DisplayOrientations.PortraitFlipped:
            displayOffset = 90;
            break;
     }

    double displayCompensatedHeading = (heading + displayOffset) % 360;

    // Update the UI...
}

Afficher l’orientation avec l’accéléromètre et le gyromètre

Ce tableau convertit les données d’accéléromètre et de gyromètre pour l’orientation de l’affichage.

Axes de référence X Y Z
Paysage X Y Z
Portrait Y -X Z
LandscapeFlipped -X -y Z
PortraitFlipped -y X Z

L’exemple de code suivant applique ces conversions au gyromètre.

private void ReadingChanged(object sender, GyrometerReadingChangedEventArgs e)
{
    double x_Axis;
    double y_Axis;
    double z_Axis;

    GyrometerReading reading = e.Reading;  

    // Calculate the gyrometer axes based on
    // the current display orientation.
    DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();
    switch (displayInfo.CurrentOrientation)
    {
        case DisplayOrientations.Landscape:
            x_Axis = reading.AngularVelocityX;
            y_Axis = reading.AngularVelocityY;
            z_Axis = reading.AngularVelocityZ;
            break;
        case DisplayOrientations.Portrait:
            x_Axis = reading.AngularVelocityY;
            y_Axis = -1 * reading.AngularVelocityX;
            z_Axis = reading.AngularVelocityZ;
            break;
        case DisplayOrientations.LandscapeFlipped:
            x_Axis = -1 * reading.AngularVelocityX;
            y_Axis = -1 * reading.AngularVelocityY;
            z_Axis = reading.AngularVelocityZ;
            break;
        case DisplayOrientations.PortraitFlipped:
            x_Axis = -1 * reading.AngularVelocityY;
            y_Axis = reading.AngularVelocityX;
            z_Axis = reading.AngularVelocityZ;
            break;
     }

    // Update the UI...
}

Afficher l’orientation et l’orientation de l’appareil

Les données OrientationSensor doivent être modifiées de manière différente. Considérez ces différentes orientations comme des rotations dans le sens inverse de l’axe z. Nous devons donc inverser la rotation pour récupérer 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, et 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 rapport à l’objet absolu. Notez que cette mathématique n’est pas commutative.

Multiplier l’objet de référence par rapport à 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 autour de Z Quaternion de référence (rotation inverse) Matrice de rotation de référence (rotation inverse)
Paysage 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]

Voir aussi

Intégration des capteurs de mouvement et d’orientation