Orientamento del sensore

I dati dei sensori delle classi Accelerometro, Giroscopio, Bussola, Inclinometro, e Orientamento vengono definiti dai relativi assi di riferimento. Questi assi sono definiti dal quadro di riferimento del dispositivo e ruotano con il dispositivo quando l'utente lo trasforma. Se l'app supporta la rotazione automatica e orienta di nuovo se stessa per adattarla quando l'utente la ruota, regolare i dati del sensore per la rotazione prima di usarla.

API importanti

Orientamento dello schermo e orientamento del dispositivo

Per comprendere gli assi di riferimento per i sensori, è necessario distinguere l'orientamento dello schermo dall'orientamento del dispositivo. L'orientamento dello schermo è il testo della direzione e le immagini vengono visualizzate sullo schermo, mentre l'orientamento del dispositivo è il posizionamento fisico del dispositivo.

Nota

L'asse z positivo si estende dalla schermata del dispositivo, come illustrato nell'immagine seguente. Asse Z per laptop

Nei diagrammi seguenti, sia il dispositivo che l'orientamento dello schermo sono in Orizzontale (gli assi del sensore illustrati sono specifici dell'orientamento orizzontale).

Questo diagramma mostra sia la visualizzazione che l'orientamento del dispositivo in Orizzontale.

Visualizzazione e orientamento del dispositivo in orizzontale

Il diagramma successivo mostra sia la visualizzazione che l'orientamento del dispositivo in LandscapeFlipped.

Visualizzazione e orientamento del dispositivo in OrizzontaleFlipped

Questo diagramma finale mostra l'orientamento dello schermo in Orizzontale mentre l'orientamento del dispositivo è LandscapeFlipped.

Orientamento dello schermo in orizzontale mentre l'orientamento del dispositivo è orizzontale

È possibile eseguire una query sui valori di orientamento tramite la classe DisplayInformation utilizzando il metodo GetForCurrentView con la proprietà CurrentOrientation. È quindi possibile creare la logica confrontando l'enumerazione DisplayOrientations . Tenere presente che per ogni orientamento supportato, è necessario supportare una conversione degli assi di riferimento in tale orientamento.

Dispositivi con orientamento orizzontale e verticale

I produttori producono i dispositivi orizzontale e verticale. Il frame di riferimento varia tra i dispositivi orizzontale (ad esempio desktop e portatili) e i dispositivi verticali (ad esempio telefoni e tablet). La tabella seguente illustra gli assi dei sensori per i dispositivi orizzontale e verticale.

Orientamento Orizzontale Verticale
Orizzontale Dispositivo orizzontale in orientamento orizzontale Dispositivo verticale in orientamento orizzontale
Verticale Dispositivo orizzontale con orientamento verticale Dispositivo verticale in orientamento verticale
LandscapeFlipped Dispositivo orizzontale in orientamento orizzontale con orientamento orizzontale Dispositivo verticale in orientamento orizzontale
PortraitFlipped Dispositivo orizzontale in orientamento verticale con orientamento verticale Dispositivo verticale in orientamento verticale con orientamento verticale

Dispositivi che trasmettono dispositivi display e headless

Alcuni dispositivi hanno la possibilità di trasmettere lo schermo a un altro dispositivo. Ad esempio, si potrebbe prendere un tablet e trasmettere lo schermo a un proiettore che sarà in orientamento orizzontale. In questo scenario, è importante tenere presente che l'orientamento del dispositivo è basato sul dispositivo originale, non quello che presenta lo schermo. Quindi un accelerometro segnala i dati per il tablet.

Inoltre, alcuni dispositivi non hanno uno schermo. Con questi dispositivi, l'orientamento predefinito per questi dispositivi è verticale.

Orientamento dello schermo e intestazione bussola

L'intestazione della bussola dipende dagli assi di riferimento e quindi cambia con l'orientamento del dispositivo. È possibile compensare in base alla tabella (si supponga che l'utente si trovi a nord).

Orientamento dello schermo Asse di riferimento per l'intestazione della bussola Direzione della bussola API quando è rivolta a nord (orizzontale) Direzione della bussola API quando è rivolta a nord (verticale) Compensazione dell'intestazione bussola (orizzontale) Compensazione dell'intestazione della bussola (verticale)
Orizzontale -Z 0 270 Intestazione (Intestazione + 90) % 360
Verticale Y 90 0 (Intestazione + 270) % 360 Intestazione
LandscapeFlipped Z 180 90 (Intestazione + 180) % 360 (Intestazione + 270) % 360
PortraitFlipped Y 270 180 (Intestazione + 90) % 360 (Intestazione + 180) % 360

Modificare l'intestazione della bussola come illustrato nella tabella per visualizzare correttamente l'intestazione. Nel frammento di codice riportato di seguito viene illustrato come effettuare questa operazione.

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

Orientamento dello schermo con l'accelerometro e il giroscopio

Questa tabella converte i dati dell'accelerometro e del giroscopio per l'orientamento dello schermo.

Assi di riferimento X Y Z
Orizzontale X Y Z
Verticale Y -X Z
LandscapeFlipped -X -y Z
PortraitFlipped -y X Z

L'esempio di codice seguente applica queste conversioni al giroscopio.

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

Orientamento dello schermo e orientamento del dispositivo

I dati OrientationSensor devono essere modificati in modo diverso. Si considerino questi diversi orientamenti come rotazioni in senso antiorario all'asse z, quindi è necessario invertire la rotazione per tornare all'orientamento dell'utente. Per i dati quaternione, è possibile usare la formula di Eulero per definire una rotazione con un quaternione di riferimento ed è anche possibile usare una matrice di rotazione di riferimento.

Formula di Eulero

Per ottenere l'orientamento relativo desiderato, moltiplicare l'oggetto di riferimento rispetto all'oggetto assoluto. Si noti che questo calcolo non è commutativo.

Moltiplicare l'oggetto riferimento per l'oggetto assoluto

Nell'espressione precedente l'oggetto assoluto viene restituito dai dati del sensore.

Orientamento dello schermo Rotazione in senso antiorario intorno a Z Quaternione di riferimento (rotazione inversa) Matrice di rotazione di riferimento (rotazione inversa)
Orizzontale 0 1 + 0i + 0j + 0k [1 0 0
0 1 0
0 0 1]
Verticale 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]

Vedi anche

Integrazione dei sensori di movimento e orientamento