Share via


Orientación del sensor

Los datos de sensor procedentes de las clases Accelerometer, Gyrometer, Compass, Inclinometer y OrientationSensor se definen por medio de sus ejes de referencia. Estos ejes se definen mediante el marco de referencia del dispositivo y giran con el dispositivo a medida que lo convierte el usuario. Si tu aplicación admite el giro automático y cambia su orientación para amoldarse al dispositivo cuando el usuario lo gire, deberás ajustar los datos de sensor para el giro antes de usarlos.

API importantes

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

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

Nota

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 la pantalla se encuentran en Horizontal (los ejes del sensor que se muestran son específicos de la orientación horizontal).

En este diagrama se muestra la visualización y la orientación del dispositivo en Horizontal.

Orientación de la pantalla y del dispositivo en horizontal

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

Orientación de la pantalla y del dispositivo en LandscapeFlipped

En este diagrama final se muestra la orientación de la pantalla en Horizontal mientras que la orientación del dispositivo es LandscapeFlipped.

Orientación de pantalla en Landscape con la orientación del dispositivo en LandscapeFlipped

Los valores de orientación se consultan a través de la clase DisplayInformation, usando para ello el método GetForCurrentView con la propiedad CurrentOrientation. Luego, se puede crear lógica contrastándolos con la enumeración DisplayOrientations. No olvides que, por cada orientación que admitas, deberás admitir también una conversión de los ejes de referencia a dicha orientación.

Dispositivos con orientación horizontal predeterminada y dispositivos con orientación vertical predeterminada

Los fabricantes producen dispositivos tanto con orientación horizontal predeterminada como con orientación vertical predeterminada. El marco de referencia varía entre dispositivos con orientación horizontal predeterminada (por ejemplo, equipos de escritorio y portátiles) y dispositivos con orientación vertical predeterminada (por ejemplo, teléfonos y algunas tabletas). En la siguiente tabla se muestran los ejes de sensor para ambos tipos de dispositivo, con orientación horizontal predeterminada y con orientación vertical predeterminada.

Orientación Con orientación horizontal predeterminada Con orientación vertical predeterminada
Horizontal Dispositivo con orientación horizontal predeterminada en orientación Landscape Dispositivo con orientación vertical predeterminada en orientación Landscape
Vertical Dispositivo con orientación horizontal predeterminada en orientación Portrait Dispositivo con orientación vertical predeterminada en orientación Portrait
LandscapeFlipped Dispositivo con orientación horizontal predeterminada en orientación LandscapeFlipped Dispositivo con orientación vertical predeterminada en orientación LandscapeFlipped
PortraitFlipped Dispositivo con orientación horizontal predeterminada en orientación PortraitFlipped Dispositivo con orientación vertical predeterminada en orientación PortraitFlipped

Difusión de presentaciones con dispositivos y dispositivos sin periféricos

Algunos dispositivos tienen la capacidad de difundir la presentación a otro dispositivo. Por ejemplo, podrías tener una tableta y difundir la presentación a un proyector que estará orientado horizontalmente. En este escenario es importante tener en cuenta que la orientación del dispositivo se basa en el dispositivo original, no en el que presenta la pantalla. Por lo tanto, un acelerómetro notificará los datos de la tableta.

Además, algunos dispositivos no disponen de una pantalla. Con estos dispositivos, la orientación predeterminada de los mismos es vertical.

Orientación de la pantalla y encabezado de brújula

El encabezado de brújula depende de los ejes de referencia, de modo que cuando la orientación del dispositivo lo hace. La compensación se efectúa siguiendo esta tabla (suponiendo que el usuario mira al norte).

Orientación de la pantalla Eje de referencia y encabezado de brújula Encabezado de brújula de API cuando se enfrenta al norte (primero horizontal) Encabezado de brújula de API al enfrentarse al norte (vertical-first) Compensación de encabezado de brújula (horizontal-first) Compensación de encabezado de brújula (vertical-first)
Horizontal -Z 0 270 Dirección (Encabezado+90) % 360
Vertical Y 90 0 (Encabezado+270) % 360 Dirección
LandscapeFlipped Z 180 90 (Encabezado+180) % 360 (Encabezado+270) % 360
PortraitFlipped Y 270 180 (Encabezado+90) % 360 (Encabezado+180) % 360

Modifica el encabezado de brújula como se indica en la tabla para que dicho encabezado se muestre correctamente. En el siguiente fragmento de código, se 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.
    DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();

    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 acelerómetro y girómetro

Esta tabla convierte los datos de acelerómetro y girómetro para los datos de la pantalla.

Ejes de referencia X Y Z
Horizontal X Y Z
Vertical Y -X Z
LandscapeFlipped -X -y Z
PortraitFlipped -y X Z

El siguiente ejemplo de código aplica 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.
    DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();
    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 se cambian de otra forma. Piense en estas diferentes orientaciones como rotaciones en sentido contrario a las agujas del reloj en el eje Z, por lo que es necesario invertir la rotación para recuperar la orientación del usuario. En el caso de los datos de cuaternión, podemos emplear la fórmula de Euler para definir un giro con un cuaternión de referencia. También podemos usar una matriz de giro de referencia.

Fórmula de Euler

Para obtener la orientación relativa que deseas, multiplica el objeto de referencia por el objeto absoluto. Este cálculo no es commutativo.

Multiplicar el objeto de referencia por el objeto absoluto

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

Orientación de la pantalla Giro en el sentido contrario a las agujas del reloj en torno a Z Cuaternión de referencia (giro inverso) Matriz de giro de referencia (giro inverso)
Horizontal 0 1 + 0i + 0j + 0k [1 0 0
0 1 0
0 0 1]
Vertical 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]

Vea también

Integración de sensores de movimiento y orientación