Sensororiëntatie

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.

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. Z-as voor een laptop

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.

Weergave- en apparaatstand in Liggend

In dit volgende diagram ziet u zowel de weergave- als de apparaatstand in LandscapeFlipped.

Weergave- en apparaatstand in LandscapeFlipped

In dit laatste diagram wordt de schermstand liggend weergegeven, terwijl de apparaatstand LandscapeFlipped is.

Schermstand op Liggend terwijl de apparaatoriëntatie Omgekeerd liggend 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 Eerst liggend apparaat in liggende stand Staand-eerste apparaat in liggende afdrukstand
Portret Apparaat met standaard liggende stand in staande oriëntatie Portretgericht apparaat in portretstand
LandscapeFlipped Apparaat met primaire liggende stand in LandscapeFlipped-stand Portretgeoriënteerd apparaat in omgekeerde landschapsoriëntatie
PortraitFlipped Apparaat dat primair in liggende stand wordt gebruikt in omgekeerde staande stand Apparaat met staande voorkeursoriëntatie in de oriëntatie 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.

De formule van Euler

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.

Het verwijzingsobject vermenigvuldigen met het absolute object

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

Bewegings- en oriëntatiesensoren integreren