Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
- APIimportanti:Windows. Devices.Sensors, Windows. Devices.Sensors.Custom
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.
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.
Questo diagramma seguente mostra sia l'orientamento della visualizzazione che del dispositivo in LandscapeFlipped.
Questo diagramma finale mostra l'orientamento dello schermo in 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 |
|
|
| Ritratto |
|
|
| LandscapeFlipped |
|
|
| Verticale capovolta |
|
|
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.
Per ottenere l'orientamento relativo desiderato, moltiplicare l'oggetto riferimento rispetto all'oggetto assoluto. Si noti che questa matematica non è commutativa.
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] |