Freigeben über


Sensorausrichtung

Sensordaten aus den Klassen Beschleunigungsmesser, Gyrometer, Kompass, Neigungsmesser und OrientationSensor werden durch ihre Referenzachsen definiert. Diese Achsen werden durch den Referenzframe des Geräts definiert und mit dem Gerät gedreht, wenn der Benutzer es dreht. 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

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 der Richtungstext und die Bilder werden auf dem Bildschirm angezeigt, während die Geräteausrichtung die physische Positionierung des Geräts ist.

Hinweis

Die positive Z-Achse erstreckt sich vom Gerätebildschirm, wie in der folgenden Abbildung dargestellt. Z-Achse für Laptop

In den folgenden Diagrammen befinden sich sowohl das Gerät als auch die Anzeigeausrichtung im Querformat (die angezeigten Sensorachsen sind für die Querformatausrichtung spezifisch).

Dieses Diagramm zeigt sowohl die Anzeige- als auch die Geräteausrichtung im Querformat.

Anzeige- und Geräteausrichtung im Querformat

Dieses nächste Diagramm zeigt sowohl die Anzeige- als auch die Geräteausrichtung in LandscapeFlipped.

Anzeige- und Geräteausrichtung in LandscapeFlipped

Dieses letzte Diagramm zeigt die Anzeigeausrichtung im Querformat, während die Geräteausrichtung "LandscapeFlipped" ist.

Anzeigeausrichtung im Querformat, während die Geräteausrichtung

Sie können die Ausrichtungswerte über die DisplayInformation-Klasse abfragen, indem Sie die GetForCurrentView-Methode mit der CurrentOrientation-Eigenschaft verwenden. 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.

Querformat- und Hochformatgeräte

Hersteller produzieren sowohl Querformat- als auch Hochformatgeräte. Der Referenzrahmen variiert zwischen Querformatgeräten (z. B. Desktops und Laptops) und Hochformatgeräten (z. B. Smartphones und einigen Tablets). In der folgenden Tabelle sind die Sensorachsen für Geräte im Quer- und Hochformat dargestellt.

Ausrichtung Querformat Hochformat
Querformat Querformatgerät im Querformat Hochformatgerät im Querformat
Hochformat 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

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 die Geräteausrichtung auf dem ursprünglichen Gerät basiert und nicht auf dem Display. 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 die Standardausrichtung für diese Geräte hochformatiert.

Anzeigeausrichtung und Kompassrichtung

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).

Bildschirmausrichtung Referenzachse für Kompassrichtung API-Kompassrichtung beim Blick nach Norden (Querformat zuerst) API-Kompassrichtung nach Norden (Hochformat) Kompassrichtungskorrektur (Querformat) Kompassrichtungskorrektur (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
Querformat X Y Z
Hochformat 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 anders 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.

Eulers Formel

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

Multiplizieren des Referenzobjekts mit dem absoluten Objekt

Im vorherigen Ausdruck wird das absolute Objekt von den Sensordaten zurückgegeben.

Bildschirmausrichtung Drehung gegen den Uhrzeigersinn um Z Referenzquaternion (Umgekehrte Drehung) Referenzdrehungsmatrix (Umgekehrte Drehung)
Querformat 0 1 + 0i + 0j + 0k [1 0 0
0 1 0
0 0 1]
Hochformat 90 cos(-45 dh) + (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 dh) + (i + j + k)*sin(-135").) [0 -1 0
1 0 0
0 0 1]

Weitere Informationen

Integrieren von Bewegungs- und Ausrichtungssensoren