Orientamento del sensore

Dati dei sensori del AccelerometerGyrometer, Compass, Inclinometer e OrientationSensor sono definite dai relativi assi di riferimento. Questi assi sono definiti dal sistema di riferimento del dispositivo e ruotano con il dispositivo quando l'utente lo ruota. Se l'app supporta la rotazione automatica e riorienta se stessa per adattarla quando l'utente la ruota, devi regolare i dati del sensore per la rotazione prima di usarla.

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 è la direzione in cui il testo e le immagini vengono visualizzati sullo schermo, mentre l'orientamento del dispositivo è la posizione fisica del dispositivo.

Note

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

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

Questo diagramma mostra sia l'orientamento della visualizzazione che del dispositivo in Landscape.

Visualizzazione e orientamento del dispositivo in orizzontale

Questo diagramma seguente mostra sia l'orientamento della visualizzazione che del dispositivo in LandscapeFlipped.

Visualizzazione e orientamento del dispositivo in orizzontale capovolto

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

Orientamento del display su Orizzontale mentre l'orientamento del dispositivo è LandscapeFlipped

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

Dispositivi con orientamento prima in orizzontale o prima in verticale

I produttori realizzano sia dispositivi progettati principalmente per l'orientamento orizzontale sia dispositivi progettati principalmente per l'orientamento verticale. Il quadro di riferimento varia tra i dispositivi concepiti principalmente per l’orientamento orizzontale (come desktop e portatili) e i dispositivi concepiti principalmente per l’orientamento verticale (come telefoni e alcuni tablet). La tabella seguente mostra gli assi del sensore per i dispositivi con orientamento principale orizzontale e verticale.

Orientamento Prima in orizzontale Priorità al formato verticale
Paesaggio Dispositivo progettato principalmente per l'orientamento orizzontale in orientamento orizzontale Dispositivo progettato principalmente per l’orientamento verticale in orientamento orizzontale
Ritratto Dispositivo orizzontale con orientamento verticale Dispositivo ottimizzato per la modalità verticale con orientamento verticale
LandscapeFlipped Dispositivo con orientamento principale orizzontale nell'orientamento orizzontale capovolto Dispositivo con orientamento principale verticale in orientamento orizzontale capovolto
Verticale capovolta Dispositivo con orientamento predefinito orizzontale in orientamento verticale capovolto Dispositivo con orientamento principale verticale in orientamento verticale capovolto

Dispositivi con display e dispositivi senza display

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 del display e direzione della 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 (orientamento orizzontale) Orientamento della bussola API quando è rivolta verso nord (in orientamento verticale) Compensazione della direzione della bussola (prima in orizzontale) Compensazione dell'orientamento della bussola (prima in verticale)
Orizzontale -Z 0 270 Intestazione (Direzione + 90) % 360
Verticale Y 90 0 (Titolo + 270) % 360 Intestazione
LandscapeFlipped Z 180 90 (Direzione + 180) % 360 (Titolo + 270) % 360
Verticale capovolta Y 270 180 (Direzione + 90) % 360 (Direzione + 180) % 360

Modificare l'intestazione della bussola come illustrato nella tabella per visualizzare correttamente l'intestazione. Il frammento di codice seguente illustra come eseguire 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
Paesaggio X Y Z
Ritratto Y -X Z
LandscapeFlipped -X -Y Z
Verticale capovolta -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 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 riferimento rispetto all'oggetto assoluto. Si noti che questa matematica non è commutativa.

Moltiplicare l'oggetto riferimento per l'oggetto assoluto

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

Orientamento dello schermo Rotazione antiorario intorno a Z Quaternione di riferimento (rotazione inversa) Matrice di rotazione dei riferimenti (rotazione inversa)
Paesaggio 0 1 + 0i + 0j + 0k [1 0 0
0 1 0
0 0 1]
Ritratto 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]
Verticale capovolta 270 cos(-135⁰) + (i + j + k)*sin(-135⁰) [0 -1 0
1 0 0
0 0 1]

Vedere anche

Integrazione dei sensori di movimento e orientamento