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.
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.
En este diagrama siguiente se muestra la visualización y la orientación 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.
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 | ||
Vertical | ||
LandscapeFlipped | ||
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.
Para obtener la orientación relativa que deseas, multiplica el objeto de referencia por el objeto absoluto. Este cálculo no es commutativo.
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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de