Orientação do sensor

Os dados de sensor das classes Accelerometer, Gyrometer, Compass, Inclinometer e OrientationSensor são definidos por seus eixos de referência. Esses eixos são definidos pelo referencial do dispositivo e giram com o dispositivo à medida que o usuário o gira. Se o aplicativo der suporte à rotação automática e se reorientar para acomodar o dispositivo à medida que o usuário o gira, você deve ajustar os dados do sensor para a rotação antes de usá-lo.

Orientação de exibição versus orientação do dispositivo

Para entender os eixos de referência para sensores, você precisa distinguir a orientação de exibição da orientação do dispositivo. A orientação da tela é a direção em que o texto e as imagens são exibidos na tela, enquanto a orientação do dispositivo é o posicionamento físico do dispositivo.

Note

O eixo z positivo se estende para fora da tela do dispositivo, conforme mostrado na imagem a seguir. Eixo Z para laptop

Nos diagramas a seguir, o dispositivo e a orientação de exibição estão em Landscape (os eixos de sensor mostrados são específicos à orientação paisagem).

Este diagrama mostra tanto a orientação da tela quanto a do dispositivo em paisagem.

Tela e orientação do dispositivo em modo paisagem

Este próximo diagrama mostra tanto a orientação da tela quanto a do dispositivo em LandscapeFlipped.

Exibição e orientação do dispositivo no LandscapeFlipped

Este diagrama final mostra a orientação de exibição em Paisagem enquanto a orientação do dispositivo é LandscapeFlipped.

Orientação da tela em paisagem quando a orientação do dispositivo é LandscapeFlipped

Você pode consultar os valores de orientação por meio da classe DisplayInformation usando o método GetForCurrentView com a propriedade CurrentOrientation. Em seguida, você pode criar lógica comparando com a enumeração DisplayOrientations. Lembre-se de que, para cada orientação suportada, você precisa oferecer suporte à conversão dos eixos de referência para essa orientação.

Dispositivos voltados primeiro para o modo paisagem vs. para o modo retrato

Os fabricantes produzem tanto dispositivos projetados principalmente para o modo paisagem quanto para o modo retrato. O referencial varia entre dispositivos com orientação horizontal como padrão (como desktops e laptops) e dispositivos com orientação vertical como padrão (como celulares e alguns tablets). A tabela a seguir mostra os eixos do sensor para dispositivos com orientação principal paisagem e retrato.

Orientação Paisagem-first Retrato-primeiro
Paisagem Dispositivo prioritariamente horizontal na orientação horizontal Dispositivo com orientação primária vertical em orientação paisagem
Portrait Dispositivo voltado principalmente para o modo paisagem em orientação retrato Dispositivo com orientação principal vertical em orientação retrato
LandscapeFlipped Dispositivo paisagístico na orientação LandscapeFlipped Dispositivo portrait-first na orientação LandscapeFlipped
PortraitFlipped Dispositivo paisagístico na orientação PortraitFlipped Dispositivo portrait-first na orientação PortraitFlipped

Dispositivos que transmitem a exibição e dispositivos sem cabeça

Alguns dispositivos têm a capacidade de transmitir a exibição para outro dispositivo. Por exemplo, você pode usar um tablet e transmitir a tela para um projetor que estará na orientação horizontal. Nesse cenário, é importante ter em mente que a orientação do dispositivo é baseada no dispositivo original, não naquele que apresenta a exibição. Portanto, um acelerômetro relataria dados para o tablet.

Além disso, alguns dispositivos não têm tela. Com esses dispositivos, a orientação padrão para esses dispositivos é retrato.

Exibir orientação e direção da bússola

A direção da bússola depende dos eixos de referência adotados e, portanto, muda com a orientação do dispositivo. Você compensa com base nessa tabela (suponha que o usuário esteja voltado para o norte).

Orientação de exibição Eixo de referência para o rumo da bússola Direção da bússola da API quando voltado para o norte (modo paisagem primeiro) Direção da bússola da API ao apontar para o norte (com o dispositivo na vertical) Compensação da direção da bússola (com a orientação paisagem primeiro) Compensação do rumo da bússola (modo retrato primeiro)
Paisagem -Z 0 270 Cabeçalho (Título + 90) % 360
Retrato Y 90 0 (Título + 270) % 360 Cabeçalho
LandscapeFlipped Z 180 90 (Título + 180) % 360 (Título + 270) % 360
PortraitFlipped Y 270 180 (Título + 90) % 360 (Título + 180) % 360

Modifique o rumo da bússola, conforme mostrado na tabela, para exibir corretamente o rumo. O snippet de código a seguir demonstra como fazer isso.

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...
}

Exibir orientação com o acelerômetro e o giroter

Esta tabela converte dados de acelerômetro e giroter para orientação de exibição.

Eixos de referência X Y Z
Paisagem X Y Z
Portrait Y -X Z
LandscapeFlipped -X -Y Z
PortraitFlipped -Y X Z

O exemplo de código a seguir aplica essas conversões ao 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...
}

Orientação de exibição e orientação do dispositivo

Os dados OrientationSensor devem ser alterados de uma maneira diferente. Pense nessas orientações diferentes como rotações no sentido anti-horário para o eixo z, portanto, precisamos reverter a rotação para recuperar a orientação do usuário. Para dados de quatérnio, podemos usar a fórmula de Euler para definir uma rotação com um quatérnio de referência e também podemos usar uma matriz de rotação de referência.

Fórmula de Euler

Para obter a orientação relativa desejada, multiplique o objeto de referência em relação ao objeto absoluto. Observe que essa matemática não é commutativa.

Multiplicar o objeto de referência em relação ao objeto absoluto

Na expressão anterior, o objeto absoluto é retornado pelos dados do sensor.

Orientação de exibição Rotação no sentido anti-horário em torno de Z Quatérnio de referência (rotação inversa) Matriz de rotação de referência (rotação inversa)
Paisagem 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]

Consulte também

Integrando sensores de movimento e orientação