Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les données de capteur des classes Accéléromètre, Gyromètre, Compas, Inclinomètre et OrientationSensor sont définies par leurs axes de référence. Ces axes sont définis par le repère de référence de l’appareil et tournent avec lui lorsque l’utilisateur le fait pivoter. 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 :Windows.Devices.Sensors, Windows.Devices.Sensors.Custom
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 correspond au sens dans lequel le texte et les images sont affichés à l’écran, tandis que l’orientation de l’appareil correspond à la position physique de l’appareil.
Note
L’axe z positif s’étend à partir de l’écran de l’appareil, comme indiqué dans l’image suivante.
Dans les diagrammes suivants, l’appareil et l’orientation de l’affichage se trouvent dans Landscape (les axes de capteur affichés sont spécifiques à l’orientation paysage).
Ce diagramme montre à la fois l’orientation de l’affichage et de l’appareil dans Landscape.
Ce diagramme suivant montre à la fois l’affichage et l’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.
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 définir 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 conçus d’abord pour le mode paysage ou le mode portrait
Les fabricants fabriquent à la fois des appareils conçus d’abord pour le mode paysage et d’autres d’abord pour le mode portrait. Le référentiel varie selon qu’il s’agit d’appareils conçus d’abord pour le mode paysage (comme les ordinateurs de bureau et les ordinateurs portables) ou d’appareils conçus d’abord pour le mode portrait (comme les téléphones et certaines tablettes). Le tableau suivant présente les axes du capteur pour les appareils orientés d’abord en mode paysage et d’abord en mode portrait.
| Orientation | Paysage d’abord | Portrait d’abord |
|---|---|---|
| Paysage |
|
|
| Portrait |
|
|
| LandscapeFlipped |
|
|
| 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. Donc, un accéléromètre fournirait des données sur 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 cap de la boussole
Le cap de la boussole dépend des axes de référence et varie donc avec l’orientation de l’appareil. Vous compensez en fonction de ce tableau (en supposant que l’utilisateur fait face au nord).
| Orientation de l’affichage | Axe de référence pour le cap de la boussole | Cap de la boussole de l’API lorsqu’elle est orientée vers le nord (mode paysage d’abord) | Cap de la boussole de l’API lorsque l’appareil est orienté vers le nord (mode portrait d’abord) | Compensation du cap de la boussole (mode paysage d’abord) | Compensation du cap de la boussole (mode portrait d’abord) |
|---|---|---|---|---|---|
| Paysage | -Z | 0 | 270 | Titre | (Titre + 90) % 360 |
| Portrait | Y | 90 | 0 | (Titre + 270) % 360 | Titre |
| LandscapeFlipped | Z | 180 | 90 | (Titre + 180) % 360 | (Titre + 270) % 360 |
| PortraitFlipped | Y | 270 | 180 | (Titre + 90) % 360 | (Titre + 180) % 360 |
Modifiez le cap de la boussole comme indiqué dans le tableau afin d’afficher correctement le cap. 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.
// In WinUI 3 desktop apps, use interop to get DisplayInformation for the current window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(App.Window);
DisplayInformation displayInfo = DisplayInformation.CreateForWindowId(
Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd));
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.
// In WinUI 3 desktop apps, use interop to get DisplayInformation for the current window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(App.Window);
DisplayInformation displayInfo = DisplayInformation.CreateForWindowId(
Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd));
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...
}
orientation de l’écran et 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.
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.
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
Windows developer