Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sensordaten aus dem Accelerometer, Gyrometer, Compass, Inclinometer und OrientationSensor Klassen werden durch ihre Referenzachsen definiert. Diese Achsen werden durch den Referenzrahmen des Geräts definiert und drehen sich mit dem Gerät, wenn der Benutzer es bewegt. Wenn Ihre App die automatische Drehung unterstützt und sich neu an das Gerät anpasst, während der Benutzer es dreht, müssen Sie die Sensordaten für die Drehung anpassen, bevor Sie es verwenden.
- Wichtige APIs:Windows.Devices.Sensors, Windows.Devices.Sensors.Custom
Anzeigeausrichtung im Vergleich zur Geräteausrichtung
Um die Referenzachsen für Sensoren zu verstehen, müssen Sie die Anzeigeausrichtung von der Geräteausrichtung unterscheiden. Die Bildschirmausrichtung ist die Richtung, in der Text und Bilder auf dem Bildschirm angezeigt werden, während die Geräteausrichtung die physische Ausrichtung des Geräts ist.
Note
Die positive Z-Achse ragt aus dem Bildschirm des Geräts heraus, wie in der folgenden Abbildung dargestellt.
In den folgenden Diagrammen sind sowohl das Gerät als auch die Displayausrichtung im Querformat (die dargestellten Sensorachsen sind spezifisch für das Querformat).
Dieses Diagramm zeigt sowohl die Anzeige- als auch die Geräteausrichtung in Landscape.
Dieses nächste Diagramm zeigt sowohl die Anzeige- als auch die Geräteausrichtung in LandscapeFlipped.
Dieses letzte Diagramm zeigt die Anzeigeausrichtung im Querformat, während die Geräteausrichtung LandscapeFlipped ist.
Sie können die Ausrichtungswerte mithilfe der DisplayInformation Klasse mithilfe der GetForCurrentView-Methode mit der CurrentOrientation-Eigenschaft abfragen. Anschließend können Sie Logik erstellen, indem Sie mit der DisplayOrientations-Enumeration vergleichen. Denken Sie daran, dass Sie für jede ausrichtung, die Sie unterstützen, eine Konvertierung der Referenzachsen in diese Ausrichtung unterstützen müssen.
Geräte mit primärem Querformat vs. Geräte mit primärem Hochformat
Hersteller stellen sowohl für das Querformat als auch für das Hochformat optimierte Geräte her. Der Referenzrahmen variiert zwischen Geräten im Querformat (z. B. Desktops und Laptops) und Geräten im Hochformat (z. B. Smartphones und einigen Tablets). In der folgenden Tabelle sind die Sensorachsen für Geräte im Quer- und Hochformat dargestellt.
| Orientierung | Querformat zuerst | Hochformat zuerst |
|---|---|---|
| Landschaft |
|
|
| Portrait |
|
|
| LandscapeFlipped |
|
|
| PortraitFlipped |
|
|
Geräte, die Bildschirm- und Kopflose Geräte übertragen
Einige Geräte haben die Möglichkeit, die Anzeige auf ein anderes Gerät zu übertragen. Sie können z. B. ein Tablet aufnehmen und das Display auf einen Projektor übertragen, der sich im Querformat befindet. In diesem Szenario ist es wichtig zu beachten, dass sich die Geräteausrichtung nach dem Originalgerät richtet und nicht nach dem Gerät, das die Anzeige darstellt. Ein Beschleunigungsmesser würde also Daten für das Tablet melden.
Darüber hinaus verfügen einige Geräte nicht über ein Display. Bei diesen Geräten ist das Hochformat die Standardausrichtung.
Bildschirmausrichtung und Kompasskurs
Die Kompassrichtung hängt von den Referenzachsen ab und ändert sich daher mit der Geräteausrichtung. Sie entschädigen basierend auf dieser Tabelle (davon aus, dass der Benutzer nach Norden gerichtet ist).
| Anzeigeausrichtung | Referenzachse für Kompassrichtung | API-Kompassausrichtung bei Ausrichtung nach Norden (zuerst im Querformat) | API-Kompassausrichtung bei Ausrichtung nach Norden (zuerst Hochformat) | Kompassausrichtungskompensation (zuerst Querformat) | Kompasskurskompensation (zuerst Hochformat) |
|---|---|---|---|---|---|
| Querformat | -Z | 0 | 270 | Überschrift | (Überschrift + 90) % 360 |
| Hochformat | Y | 90 | 0 | (Überschrift + 270) % 360 | Überschrift |
| LandscapeFlipped | Z | 180 | 90 | (Überschrift + 180) % 360 | (Überschrift + 270) % 360 |
| PortraitFlipped | Y | 270 | 180 | (Überschrift + 90) % 360 | (Überschrift + 180) % 360 |
Ändern Sie die Kompassrichtung wie in der Tabelle dargestellt, um die Überschrift korrekt anzuzeigen. Der folgende Codeausschnitt veranschaulicht, wie dies funktioniert.
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...
}
Anzeigeausrichtung mit Beschleunigungsmesser und Gyrometer
In dieser Tabelle werden Beschleunigungsmesser- und Gyrometerdaten für die Anzeigeausrichtung konvertiert.
| Referenzachsen | X | Y | Z |
|---|---|---|---|
| Landschaft | X | Y | Z |
| Portrait | Y | -X | Z |
| LandscapeFlipped | -X | -Y | Z |
| PortraitFlipped | -Y | X | Z |
Im folgenden Codebeispiel werden diese Konvertierungen auf das Gyrometer angewendet.
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...
}
Bildschirmausrichtung und Geräteausrichtung
Die OrientationSensor-Daten müssen auf andere Weise geändert werden. Stellen Sie sich diese verschiedenen Ausrichtungen als Drehungen gegen den Uhrzeigersinn zur Z-Achse vor, daher müssen wir die Drehung umkehren, um die Ausrichtung des Benutzers zurückzuholen. Für Quaternionsdaten können wir die Euler-Formel verwenden, um eine Drehung mit einem Referenzquaternion zu definieren, und wir können auch eine Referenzdrehungsmatrix verwenden.
Um die gewünschte relative Ausrichtung abzurufen, multiplizieren Sie das Referenzobjekt mit dem absoluten Objekt. Beachten Sie, dass diese Mathematik nicht kommutativ ist.
Im vorherigen Ausdruck wird das absolute Objekt von den Sensordaten zurückgegeben.
| Anzeigeausrichtung | Drehung gegen den Uhrzeigersinn um Z | Referenzquaternion (inverse Drehung) | Referenzdrehungsmatrix (Umgekehrte Drehung) |
|---|---|---|---|
| Landschaft | 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] |
Siehe auch
Windows developer