Dati dei sensori e orientamento dello schermo (HTML)

[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]

I dati dei sensori dalle classi Accelerometer, Gyrometer, Compass, Inclinometer e OrientationSensor sono definiti dai rispettivi assi di riferimento. Questi assi sono definiti dall'orientamento orizzontale del dispositivo e ruotano insieme al dispositivo quando viene girato dall'utente. Se la tua app supporta la rotazione automatica, ovvero se adatta il proprio orientamento a quello del dispositivo quando viene ruotato dall'utente, devi modificare i dati dei sensori per la rotazione prima di usare l'app.

Orientamento della visualizzazione e orientamento del dispositivo

Per comprendere gli assi di riferimento dei sensori, è necessario distinguere l'orientamento della visualizzazione dall'orientamento del dispositivo. L'orientamento della visualizzazione è la direzione in cui sono visualizzati testo e immagini sullo schermo, mentre l'orientamento del dispositivo si riferisce al posizionamento fisico di quest'ultimo. Nella figura seguente sia l'orientamento del dispositivo sia quello della visualizzazione è Landscape.

Orientamento orizzontale della visualizzazione e del dispositivo

Nella figura seguente sia l'orientamento del dispositivo sia quello della visualizzazione è LandscapeFlipped.

Orientamento orizzontale capovolto della visualizzazione e del dispositivo

Nella figura successiva l'orientamento della visualizzazione è orizzontale mentre quello del dispositivo è orizzontale capovolto.

L'orientamento della visualizzazione è orizzontale mentre quello del dispositivo è orizzontale capovolto.

Puoi richiedere i valori dell'orientamento tramite la classe DisplayInformation usando il metodo GetForCurrentView con la proprietà CurrentOrientation. Puoi quindi creare la logica eseguendo un confronto in base all'enumerazione DisplayOrientations. Ricordati che, per ogni orientamento supportato, devi supportare la conversione degli assi di riferimento per tale orientamento.

Dispositivi con orientamento orizzontale predefinito e con orientamento verticale predefinito

I produttori offrono sia dispositivi con orientamento orizzontale predefinito sia dispositivi con orientamento verticale predefinito. L'integrazione di componenti nei dispositivi da parte dei produttori avviene in modo unificato e coerente in modo che tutti i dispositivi funzionino entro lo stesso quadro di riferimento. Nella tabella seguente sono indicati gli assi dei sensori per i dispositivi con orientamento orizzontale e con orientamento verticale predefinito.

Orientamento Orizzontale predefinito Verticale predefinito

Landscape

Dispositivo con orientamento orizzontale predefinito in orientamento orizzontale Dispositivo con orientamento verticale predefinito in orientamento orizzontale

Portrait

Dispositivo con orientamento orizzontale predefinito in orientamento verticale Dispositivo con orientamento verticale predefinito in orientamento verticale

LandscapeFlipped

Dispositivo con orientamento orizzontale predefinito in orientamento orizzontale capovolto Dispositivo con orientamento verticale predefinito in orientamento orizzontale capovolto

PortraitFlipped

Dispositivo con orientamento orizzontale predefinito in orientamento verticale capovolto Dispositivo con orientamento verticale predefinito in orientamento verticale capovolto

 

Orientamento dello schermo e prua bussola

La prua bussola dipende dagli assi di riferimento e quindi cambia in base all'orientamento del dispositivo. Puoi eseguire le compensazioni facendo riferimento a questa tabella, presupponendo che l'utente sia rivolto a nord.

Orientamento dello schermo Asse di riferimento per la prua bussola API - Prua bussola rivolta a nord Compensazione prua bussola

Landscape

-Z

0

Prua

Portrait

Y

90

(Prua + 270) % 360

LandscapeFlipped

Z

180

(Prua + 180) % 360

PortraitFlipped

Y

270

(Prua + 90) % 360

 

Modifica la prua bussola come indicato nella tabella per visualizzare correttamente la prua, come qui illustrato.

function readingChanged(e) {
    var heading = e.reading.headingMagneticNorth;
    var displayOffset;

    // Calculate the compass heading offset based on
    // the current display orientation.
    var displayInfo = Windows.Graphics.Display.DisplayInformation.getForCurrentView();
    
    switch (displayInfo.currentOrientation) {
        case Windows.Graphics.Display.DisplayOrientations.landscape:
            displayOffset = 0;
            break;
        case Windows.Graphics.Display.DisplayOrientations.portrait:
            displayOffset = 270;
            break;
        case Windows.Graphics.Display.DisplayOrientations.landscapeFlipped:
            displayOffset = 180;
            break;
        case Windows.Graphics.Display.DisplayOrientations.portraitFlipped:
            displayOffset = 90;
            break;
     }

    var displayCompensatedHeading = (heading + displayOffset) % 360;

    // Update the UI...
}

Orientamento dello schermo con accelerometro e giroscopio

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

Assi di riferimento X Y Z

Landscape

X

Y

Z

Portrait

Y

-X

Z

LandscapeFlipped

-X

-Y

Z

PortraitFlipped

-Y

X

Z

 

Ecco un esempio di codice che applica le conversioni al giroscopio.

function readingChanged(e) {
    var reading = e.reading;
    var displayOffset;

    // Calculate the gyrometer axes based on
    // the current display orientation.
    var displayInfo = Windows.Graphics.Display.DisplayInformation.getForCurrentView();
    switch (displayInfo.currentOrientation) {
        case Windows.Graphics.Display.DisplayOrientations.landscape: 
            x_Axis = reading.angularVelocityX;
            y_Axis = reading.angularVelocityY;
            z_Axis = reading.angularVelocityZ;
            break;
        case Windows.Graphics.Display.DisplayOrientations.portrait: 
            x_Axis = reading.angularVelocityY;
            y_Axis = -1 * reading.angularVelocityX;
            z_Axis = reading.angularVelocityZ;
            break; 
        case Windows.Graphics.Display.DisplayOrientations.landscapeFlipped: 
            x_Axis = -1 * reading.angularVelocityX;
            y_Axis = -1 * reading.angularVelocityY;
            z_Axis = reading.angularVelocityZ;
            break; 
        case Windows.Graphics.Display.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

OrientationSensor deve essere modificato in modo diverso. I diversi orientamenti possono essere pensati come rotazioni in senso antiorario rispetto all'asse Z, quindi dobbiamo invertire la rotazione per tornare all'orientamento dell'utente. Per i dati del quaternione possiamo usare la formula di Euler per definire una rotazione con un quaternione di riferimento e possiamo anche usare una matrice di rotazione di riferimento.

Formula di Euler

Per ottenere l'orientamento relativo desiderato, moltiplica l'oggetto di riferimento per l'oggetto assoluto. Nota che questa operazione matematica non è commutativa.

Moltiplicazione dell'oggetto di riferimento per l'oggetto assoluto

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

Orientamento dello schermo Rotazione in senso antiorario attorno a Z Quaternione di riferimento (rotazione inversa) Matrice di rotazione di riferimento (rotazione inversa)

Landscape

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]

PortraitFlipped

270

cos(-135⁰) + (i + j + k)*sin(-135⁰)

[0 -1 0

1 0 0

0 0 1]