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.
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.
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 ü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 | ||
Hochformat | ||
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 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.
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.
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] |