Orientación del sensor

Los datos de sensor de las clases Accelerometer, Gyrometer, Compass, Inclinometer y OrientationSensor se definen mediante sus ejes de referencia. Estos ejes están definidos por el sistema de referencia del dispositivo y giran con el dispositivo cuando el usuario lo gira. Si la aplicación admite la rotación automática y se vuelve a orientar para adaptarse al dispositivo a medida que el usuario lo gira, debes ajustar los datos del sensor para la rotación antes de usarlos.

Orientación de la pantalla frente a orientación del dispositivo

Para comprender los ejes de referencia de los sensores, debe distinguir la orientación de la pantalla de la orientación del dispositivo. La orientación de la pantalla es la dirección en la que se muestran el texto y las imágenes en la pantalla, mientras que la orientación del dispositivo es la posición física del dispositivo.

Note

El eje Z positivo se extiende desde la pantalla del dispositivo, como se muestra en la siguiente imagen. Eje Z para portátil

En los diagramas siguientes, la orientación del dispositivo y de la pantalla se encuentran en Landscape (los ejes del sensor que se muestran son específicos de la orientación horizontal).

En este diagrama se muestra la orientación de la pantalla y del dispositivo en Landscape.

Orientación de la pantalla y del dispositivo en horizontal

En este diagrama siguiente se muestra la orientación de la pantalla y del dispositivo en LandscapeFlipped.

Visualización y orientación del dispositivo en LandscapeFlipped

Este diagrama final muestra la orientación de la pantalla en orientación horizontal mientras la orientación del dispositivo es LandscapeFlipped.

Orientación de pantalla en Horizontal mientras que la orientación del dispositivo es LandscapeFlipped

Puede consultar los valores de orientación a través de la clase DisplayInformation mediante la propiedad GetForCurrentView con la propiedad CurrentOrientation. A continuación, puede crear lógica comparando con la enumeración DisplayOrientations. Recuerde que para cada orientación que admita, debe admitir una conversión de los ejes de referencia a esa orientación.

Dispositivos diseñados primero para orientación horizontal frente a dispositivos diseñados primero para orientación vertical

Los fabricantes producen dispositivos diseñados principalmente para usarse en orientación horizontal y en orientación vertical. El marco de referencia varía entre los dispositivos cuya orientación principal es horizontal (como los ordenadores de sobremesa y los portátiles) y los dispositivos cuya orientación principal es vertical (como los teléfonos y algunas tabletas). La siguiente tabla muestra los ejes del sensor para dispositivos con orientación horizontal predeterminada y con orientación vertical predeterminada.

Orientación Primero en horizontal Prioridad al formato vertical
Apaisado Dispositivo con orientación horizontal predeterminada en orientación horizontal Dispositivo diseñado principalmente para orientación vertical en modo horizontal
Portrait Dispositivo con orientación principal horizontal en orientación vertical Dispositivo con orientación vertical predeterminada en orientación vertical
LandscapeFlipped Dispositivo con orientación horizontal predeterminada en orientación LandscapeFlipped Dispositivo con orientación principal vertical en orientación horizontal invertida
VerticalFlipped Dispositivo con orientación horizontal predeterminada en orientación vertical invertida Dispositivo con orientación principal vertical en orientación PortraitFlipped

Dispositivos que transmiten pantalla y dispositivos sin pantalla

Algunos dispositivos tienen la capacidad de difundir la pantalla a otro dispositivo. Por ejemplo, podría tomar una tableta y difundir la pantalla a un proyector que estará en orientación horizontal. En este escenario, es importante tener en cuenta que la orientación del dispositivo se basa en el dispositivo original, no en el que se presenta la pantalla. Así, un acelerómetro proporcionaría datos de la tableta.

Además, algunos dispositivos no tienen una pantalla. Con estos dispositivos, la orientación predeterminada para estos dispositivos es vertical.

Mostrar orientación y rumbo de la brújula

El encabezado de brújula depende de los ejes de referencia y, por tanto, cambia con la orientación del dispositivo. Compensa en función de esta tabla (supongamos que el usuario está orientado al norte).

Orientación de la pantalla Eje de referencia para el rumbo de la brújula Rumbo de la brújula de la API al apuntar al norte (con orientación horizontal primero) Rumbo de la brújula de la API al mirar hacia el norte (con orientación vertical) Compensación del rumbo de la brújula (con orientación horizontal primero) Compensación del rumbo de la brújula (vertical primero)
Horizontal -Z 0 270 Encabezado (Título + 90) % 360
Vertical Y 90 0 (Título + 270) % 360 Encabezado
LandscapeFlipped Z 180 90 (Título + 180) % 360 (Título + 270) % 360
VerticalInvertido Y 270 180 (Título + 90) % 360 (Título + 180) % 360

Modifique el rumbo de la brújula como se muestra en la tabla para que se muestre correctamente el rumbo. El siguiente fragmento de código muestra cómo hacerlo.

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

Orientación de la pantalla con el acelerómetro y el girómetro

En esta tabla se convierten los datos del acelerómetro y del girómetro para la orientación de la pantalla.

Ejes de referencia X Y Z
Apaisado X Y Z
Portrait Y -X Z
LandscapeFlipped -X -Y Z
VerticalFlipped -Y X Z

En el ejemplo de código siguiente se aplican estas conversiones al girómetro.

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

Orientación de la pantalla y orientación del dispositivo

Los datos de OrientationSensor deben cambiarse de un modo diferente. Piense en estas distintas orientaciones como rotaciones en sentido contrario a las agujas del reloj hacia el eje Z, por lo que es necesario invertir la rotación para recuperar la orientación del usuario. Para los datos de cuaternión, podemos usar la fórmula de Euler para definir una rotación con un cuaternión de referencia y también podemos usar una matriz de rotación de referencia.

Fórmula de Euler

Para obtener la orientación relativa que desee, multiplique el objeto de referencia en el objeto absoluto. Tenga en cuenta que esta matemática no es conmutativa.

Multiplicar el objeto de referencia con el objeto absoluto

En la expresión anterior, los datos del sensor devuelven el objeto absoluto.

Orientación de la pantalla Rotación en sentido contrario a las agujas del reloj alrededor de Z Cuaternión de referencia (rotación inversa) Matriz de rotación de referencia (rotación inversa)
Apaisado 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]
VerticalFlipped 270 cos(-135⁰) + (i + j + k)*sin(-135⁰) [0 -1 0
1 0 0
0 0 1]

Consulte también

Integración de sensores de movimiento y orientación