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.

Bildschirm- und Geräteausrichtung im Querformat

Im folgenden Bild sind sowohl Bildschirm- als auch Geräteausrichtung im LandscapeFlipped-Format.

Bildschirm- und Geräteausrichtung im LandscapeFlipped-Format

Das nächste Bild zeigt die Anzeigeausrichtung im Querformat und die Geräteausrichtung im LandscapeFlipped-Format.

Bildschirmausrichtung im Querformat und 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

Querformatgerät im Querformat Hochformatgerät im Querformat

Portrait

Querformatgerät im Hochformat Hochformatgerät im Hochformat

LandscapeFlipped

Querformatgerät in LandscapeFlipped-Ausrichtung Hochformatgerät in LandscapeFlipped-Ausrichtung

PortraitFlipped

Querformatgerät in PortraitFlipped-Ausrichtung Hochformatgerät in PortraitFlipped-Ausrichtung

 

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.

Eulersche Formel

Um die gewünschte relative Ausrichtung zu erhalten, multiplizieren Sie das Referenzobjekt mit dem absoluten Objekt. Beachten Sie, dass diese Berechnung nicht kommutativ ist.

Multiplizieren des Referenzobjekts mit dem absoluten Objekt

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]