Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Sensorgegevens uit de Accelerometer, Gyrometer, Compass, Inclinometer en OrientationSensor klassen worden gedefinieerd door hun referentieassen. Deze assen worden gedefinieerd door het referentieframe van het apparaat en draaien met het apparaat wanneer de gebruiker het draait. Als uw app automatische rotatie ondersteunt en zich opnieuw richt op het apparaat wanneer de gebruiker het draait, moet u uw sensorgegevens voor de rotatie aanpassen voordat u deze gebruikt.
- Belangrijke API's:Windows.Devices.Sensors, Windows.Devices.Sensors.Custom
Schermoriëntatie versus apparaatoriëntatie
Om de referentieassen voor sensoren te begrijpen, moet u onderscheid maken tussen schermoriëntatie en apparaatoriëntatie. De weergavestand is de richting waarin tekst en afbeeldingen op het scherm worden weergegeven, terwijl de oriëntatie van het apparaat de fysieke stand van het apparaat is.
Note
De positieve z-as breidt zich uit vanaf het scherm van het apparaat, zoals wordt weergegeven in de volgende afbeelding.
In de volgende diagrammen staan zowel het apparaat als de schermstand in liggende stand (de weergegeven sensorassen zijn specifiek voor de liggende stand).
In dit diagram ziet u zowel de weergave- als de apparaatstand in Landscape.
In dit volgende diagram ziet u zowel de weergave- als de apparaatstand in LandscapeFlipped.
In dit laatste diagram wordt de schermstand liggend weergegeven, terwijl de apparaatstand LandscapeFlipped is.
U kunt de oriëntatiewaarden opvragen via de klasse DisplayInformation met de methode GetForCurrentView en de eigenschap CurrentOrientation. Vervolgens kunt u logica maken door de opsomming DisplayOrientations te vergelijken. Houd er rekening mee dat u voor elke oriëntatie die u ondersteunt, ook een omzetting van de referentieassen naar die oriëntatie moet ondersteunen.
Landscape-first versus portrait-first-apparaten
Fabrikanten produceren zowel landscape-first- als portrait-first-apparaten. Het referentiekader verschilt tussen apparaten die primair in liggende stand worden gebruikt (zoals desktopcomputers en laptops) en apparaten die primair in staande stand worden gebruikt (zoals telefoons en sommige tablets). In de volgende tabel ziet u de sensorassen voor zowel landscape-first- als portrait-first-apparaten.
| Oriëntatie | Liggend-eerst | Portretstand eerst |
|---|---|---|
| Landschap |
|
|
| Portret |
|
|
| LandscapeFlipped |
|
|
| PortraitFlipped |
|
|
Apparaten met schermuitzending en headless-apparaten
Sommige apparaten kunnen de weergave uitzenden naar een ander apparaat. U kunt bijvoorbeeld een tablet gebruiken en het scherm weergeven op een projector die in liggende stand staat. In dit geval is het belangrijk om er rekening mee te houden dat de oriëntatie van het apparaat wordt bepaald door het oorspronkelijke apparaat, niet door het apparaat waarop het scherm wordt weergegeven. Een versnellingsmeter zou dus gegevens voor de tablet rapporteren.
Bovendien hebben sommige apparaten geen beeldscherm. Voor deze apparaten is de standaardoriëntatie de portretstand.
Schermoriëntatie en kompasrichting
Kompaskop is afhankelijk van de referentieassen en verandert dus met de apparaatstand. U compenseert op basis van deze tabel (stel dat de gebruiker naar het noorden gericht is).
| Beeldschermoriëntatie | Referentieas voor kompasrichting | API-kompasrichting wanneer u naar het noorden gericht bent (landschap eerst) | API-kompasrichting wanneer u naar het noorden bent gericht (eerst staand) | Compensatie van de kompasrichting (eerst liggend) | Compensatie van de kompasrichting (staand eerst) |
|---|---|---|---|---|---|
| Liggend | -Z | 0 | 270 | Kop | (Koers + 90) % 360 |
| Staand | Y | 90 | 0 | (richting + 270) % 360 | Kop |
| LandscapeFlipped | Z | 180 | 90 | (Kop + 180) % 360 | (richting + 270) % 360 |
| PortraitFlipped | Y | 270 | 180 | (Koers + 90) % 360 | (Kop + 180) % 360 |
Wijzig de kompaskop zoals weergegeven in de tabel om de kop correct weer te geven. In het volgende codefragment ziet u hoe u dit doet.
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...
}
Schermoriëntatie met behulp van de versnellingsmeter en gyroscoop
Deze tabel converteert accelerometer- en gyrometergegevens voor weergavestand.
| Referentieassen | X | Y | Z |
|---|---|---|---|
| Landschap | X | Y | Z |
| Portret | Y | -X | Z |
| LandscapeFlipped | -X | -Y | Z |
| PortraitFlipped | -Y | X | Z |
In het volgende codevoorbeeld worden deze conversies toegepast op de gyrometer.
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...
}
Afdrukstand en oriëntatie van het apparaat
De OrientationSensor gegevens moeten op een andere manier worden gewijzigd. Beschouw deze verschillende oriëntaties als rotaties tegen de klok in ten opzichte van de z-as, dus we moeten de rotatie omkeren om terug te keren naar de oriëntatie van de gebruiker. Voor kwaterniongegevens kunnen we de formule van Euler gebruiken om een rotatie met een referentiekwaternion te definiëren, en we kunnen ook een referentierotatiematrix gebruiken.
Als u de gewenste relatieve oriëntatie wilt verkrijgen, vermenigvuldigt u het referentieobject met het absolute object. Houd er rekening mee dat deze wiskunde niet commutatief is.
In de voorgaande expressie wordt het absolute object geretourneerd door de sensorgegevens.
| Beeldschermoriëntatie | Rotatie rond Z tegen de klok in | Referentiequaternion (omgekeerde rotatie) | Referentierotatiematrix (omgekeerde rotatie) |
|---|---|---|---|
| Landschap | 0 | 1 + 0i + 0j + 0k | [1 0 0 0 1 0 0 0 1] |
| Portret | 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] |
Zie ook
Windows developer