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.
A imagem a seguir mostra ambas as orientações de exibição e dispositivo em LandscapeFlipped.
A próxima imagem exibe a 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 |
||
Portrait |
||
LandscapeFlipped |
||
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.
Para obter a orientação relativa desejada, multiplique o objeto de referência pelo objeto absoluto. Observe que esta matemática não é comutativa.
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] |