Sensordaten und Bildschirmausrichtung (HTML)
[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]
Sensordaten der Klassen Accelerometer, Gyrometer, Compass, Inclinometer und OrientationSensor sind durch ihre Referenzachsen definiert. Diese Achsen werden durch das Querformat des Geräts bestimmt und drehen sich mit dem Gerät, wenn es vom Benutzer gedreht wird. Falls Ihre App die automatische Drehung unterstützt – d. h., wenn sie sich selbst entsprechend der Drehung des Geräts neu ausrichtet –, müssen Sie die Sensordaten für die Drehung anpassen, bevor Sie sie verwenden.
Bildschirmausrichtung und Geräteausrichtung
Um die Referenzachse für Sensoren begreifen zu können, muss zwischen Bildschirmausrichtung und Geräteausrichtung unterschieden werden. Bei der Bildschirmausrichtung handelt es sich um die Richtung, in der Text und Bilder auf dem Bildschirm angezeigt werden, wohingegen es sich bei der Geräteausrichtung um die physische Position des Geräts handelt. Im folgenden Bild sind sowohl Bildschirm- als auch Geräteausrichtung im Landscape-Format.
Im folgenden Bild sind sowohl Bildschirm- als auch Geräteausrichtung im LandscapeFlipped-Format.
Das nächste Bild zeigt die Anzeigeausrichtung im Querformat und die Geräteausrichtung im LandscapeFlipped-Format.
Sie können die Ausrichtungswerte mithilfe der DisplayInformation-Klasse abfragen, indem Sie die GetForCurrentView-Methode mit der CurrentOrientation-Eigenschaft verwenden. Anschließend können Sie durch einen Vergleich mit der DisplayOrientations-Enumeration eine Logik erstellen. Bedenken Sie, dass Sie für jede unterstützte Ausrichtung eine Konvertierung der Referenzachsen in die jeweilige Ausrichtung unterstützen müssen.
Für Querformat und für Hochformat ausgelegte Geräte
Hersteller bieten Geräte an, die sowohl für das Quer- als auch das Hochformat ausgelegt sind. Wenn Hersteller Komponenten in Geräte integrieren, erfolgt dies auf einheitliche und konsistente Weise, damit alle Geräte innerhalb desselben Referenzrahmens betrieben werden. Die folgende Tabelle enthält die Gerätesensorachsen (Hoch- und Querformat).
Ausrichtung | Für Querformat ausgelegt | Für Hochformat ausgelegt |
Landscape |
||
Portrait |
||
LandscapeFlipped |
||
PortraitFlipped |
Bildschirmausrichtung und Kompassrichtung
Die Kompassrichtung hängt von den Referenzachsen ab und ändert sich daher mit der Geräteausrichtung. Sie kompensieren dies entsprechend den Angaben in der folgenden Tabelle (unter der Annahme, dass der Benutzer nach Norden ausgerichtet ist).
Bildschirmausrichtung | Referenzachse für Kompassrichtung | API-Kompassrichtung bei Ausrichtung nach Norden | Kompensation der Kompassrichtung |
---|---|---|---|
Landscape |
-Z |
0 |
Richtung |
Portrait |
Y |
90 |
(Richtung + 270) % 360 |
LandscapeFlipped |
Z |
180 |
(Richtung + 180) % 360 |
PortraitFlipped |
Y |
270 |
(Richtung + 90) % 360 |
Ändern Sie die Kompassrichtung wie hier gezeigt entsprechend den Angaben in der Tabelle, um die Richtung korrekt anzuzeigen.
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...
}
Bildschirmausrichtung mit Beschleunigungsmesser und Gyrometer
Die folgende Tabelle zeigt, wie Beschleunigungsmesser- und Gyrometerdaten für die Bildschirmausrichtung konvertiert werden.
Referenzachsen | X | Y | Z |
---|---|---|---|
Landscape |
X |
Y |
Z |
Portrait |
Y |
-X |
Z |
LandscapeFlipped |
-X |
-Y |
Z |
PortraitFlipped |
-Y |
X |
Z |
Das folgende Codebeispiel wendet diese Konvertierungen auf das Gyrometer an.
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...
}
Bildschirmausrichtung und Geräteausrichtung
Die OrientationSensor-Daten müssen auf andere Weise geändert werden. Stellen Sie sich die unterschiedlichen Ausrichtungen als Drehungen um die Z-Achse entgegen dem Uhrzeigersinn vor. Folglich müssen wir die Drehung umkehren, um wieder die Ausrichtung des Benutzers zu erhalten. Für Quaterniondaten können wir anhand der eulerschen Formel eine Drehung mit einer Referenzquaternion definieren, und außerdem können wir eine Referenzdrehungsmatrix verwenden.
Um die gewünschte relative Ausrichtung zu erhalten, multiplizieren Sie das Referenzobjekt mit dem absoluten Objekt. Beachten Sie, dass diese Berechnung nicht kommutativ ist.
Im vorangehenden Ausdruck wird das absolute Objekt von den Sensordaten zurückgegeben.
Bildschirmausrichtung | Drehung gegen den Uhrzeigersinn um Z | Referenzquaternion (Drehung in umgekehrter Richtung) | Referenzdrehungsmatrix (Drehung in umgekehrter Richtung) |
---|---|---|---|
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] |