Dados do sensor e orientação de exibição (HTML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

Os dados do sensor das classes Accelerometer, Gyrometer, Compass, Inclinometer e OrientationSensor são definidos por seus eixos de referência. Esses eixos são definidos pela orientação paisagem do dispositivo e giram com o dispositivo conforme o usuário o vira. Se o seu aplicativo dá suporte à rotação automática, ou seja, se ele se reorienta para acomodar o dispositivo conforme o usuário o gira, você deve ajustar os dados do sensor para a rotação antes de usá-lo.

Orientação de exibição x orientação do dispositivo

Para poder compreender os eixos de referência para os sensores, você precisa distinguir entre a orientação de exibição e a orientação do dispositivo. A orientação de exibição é a direção na qual textos e imagens são exibidas na tela, enquanto que a orientação do dispositivo é a posição física do dispositivo. Na imagem a seguir, ambas as orientações de exibição e do dispositivo estão em Landscape.

Orientação de exibição e do dispositivo em Paisagem

A imagem a seguir mostra ambas as orientações de exibição e dispositivo em LandscapeFlipped.

Orientação de exibição e do dispositivo em LandscapeFlipped

A próxima imagem exibe a orientação de exibição em Paisagem, enquanto que a orientação do dispositivo é LandscapeFlipped.

Orientação de exibição em Paisagem, enquanto que a orientação do dispositivo é LandscapeFlipped.

Você pode consultar os valores de orientação por meio da classe DisplayInformation usando o método GetForCurrentView com a propriedade CurrentOrientation. Em seguida, você pode criar lógica comparando com a enumeração DisplayOrientations. Lembre-se de que para cada orientação com suporte, é necessário dar suporte a uma conversão dos eixos de referência para essa orientação.

Dispositivos de prioridade paisagem x prioridade retrato

Os fabricantes produzem agora dispositivos com ambos os formatos de prioridade paisagem e prioridade retrato. Quando o fabricante integra os componentes nos dispositivos, eles o fazem de uma maneira unificada e consistente para que todos os dispositivos operem dentro do mesmo enquadramento de referência. A tabela a seguir mostra os eixos do sensor para ambos os dispositivos prioridade paisagem e prioridade retrato.

Orientação Prioridade paisagem Prioridade retrato

Landscape

Dispositivo de prioridade paisagem em orientação Paisagem Dispositivo de prioridade retrato em orientação Paisagem

Portrait

Dispositivo de prioridade paisagem em orientação Retrato Dispositivo de prioridade retrato em orientação Retrato

LandscapeFlipped

Dispositivo de prioridade paisagem em orientação LandscapeFlipped Dispositivo de prioridade retrato em orientação LandscapeFlipped

PortraitFlipped

Dispositivo de prioridade paisagem em orientação PortraitFlipped Dispositivo de prioridade retrato em orientação PortraitFlipped

 

Orientação de exibição e direcionamento da bússola

O direcionamento da bússola depende dos eixos de referência e, portanto, muda com a orientação do dispositivo. Você compensa com base nesta tabela (pressuponha que o usuário esteja voltado para o norte).

Orientação de exibição Eixo de referência para direcionamento da bússola Direcionamento da bússola da API quando voltado para o norte Compensação do direcionamento da bússola

Landscape

-Z

0

Direcionamento

Portrait

Y

90

(Direcionamento + 270) % 360

LandscapeFlipped

Z

180

(Direcionamento + 180) % 360

PortraitFlipped

Y

270

(Direcionamento + 90) % 360

 

Modifique o direcionamento da bússola conforme mostrado na tabela a fim de exibir o direcionamento corretamente, como mostrado aqui.

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

Orientação de exibição com o acelerômetro e o giroscópio

Esta tabela converte os dados do acelerômetro e do giroscópio para orientação de exibição.

Eixos de referência X Y Z

Landscape

X

Y

Z

Portrait

Y

-X

Z

LandscapeFlipped

-X

-Y

Z

PortraitFlipped

-Y

X

Z

 

Aqui está um exemplo de código que aplica essas conversões ao giroscópio.

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

Orientação de exibição e do dispositivo

O OrientationSensor deve ser alterado de maneira diferente. Pense nas diferentes orientações como rotações no sentido anti-horário para o eixo Z, portanto, precisamos inverter a rotação para obter a orientação do usuário de volta. Para dados quatérnion, podemos usar a fórmula de Euler para definir uma rotação com um quatérnion de referência e também podemos usar uma matriz de rotação de referência.

Fórmula de Euler

Para obter a orientação relativa desejada, multiplique o objeto de referência pelo objeto absoluto. Observe que esta matemática não é comutativa.

Multiplique o objeto de referência pelo objeto absoluto.

Na expressão anterior, o objeto absoluto é retornado pelos dados do sensor.

Orientação de exibição Rotação no sentido anti-horário em torno de Z Quatérnion de referência (rotação invertida) Matriz de rotação de referência (rotação invertida)

Landscape

0

1 + 0i + 0j + 0k

[1 0 0

0 1 0

0 0 1]

Portrait

90

cos(-45⁰) + (i + j + k)*sen(-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)*sen(-135⁰)

[0 -1 0

1 0 0

0 0 1]