Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
- API importantes:Windows.Devices.Sensors, Windows.Devices.Sensors.Custom
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.
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.
En este diagrama siguiente se muestra la orientación de la pantalla y 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.
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 |
|
|
| Portrait |
|
|
| LandscapeFlipped |
|
|
| VerticalFlipped |
|
|
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.
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.
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] |