Verwenden des Neigungsmessers

Erfahren Sie, wie Sie mithilfe des Neigungsmessers Neigungs-, Roll- und Schwenkwinkel bestimmen.

In diesem Beispiel wird eine einfache App erstellt, die auf einem Neigungsmesser als Eingabegerät basiert. Bei einigen 3D-Spielen ist ein Neigungsmesser als Eingabegerät erforderlich. Ein gängiges Beispiel ist ein Flugsimulator, der die drei Achsen des Neigungsmessers (X, Y und Z) dem Aufzug, Aileron und Ruddereingaben des Flugzeugs zuordnen kann.

Note

Dieser Artikel konzentriert sich auf Code, der die Verwendung eines Neigungsmessers veranschaulicht. Eine Übersicht über den Neigungsmessersensor finden Sie unter Sensoren: Neigungsmesser.

Voraussetzungen

Sie sollten mit dem Neigungsmessersensor und dessen Verwendung vertraut sein. Siehe Sensoren: Neigungsmesser.

Das verwendete Gerät oder der Emulator muss einen Neigungsmesser unterstützen.

Beispielcode

using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;

namespace DevicesDemo.Pages
{
    public sealed partial class InclinometerPage : Page
    {
        private Inclinometer? inclinometer;

        public InclinometerPage()
        {
            InitializeComponent();

            // Get the default inclinometer sensor object.
            inclinometer = Inclinometer.GetDefault();

            if (inclinometer != null)
            {
                // Establish the report interval.
                uint minReportInterval = inclinometer.MinimumReportInterval;
                uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                inclinometer.ReportInterval = reportInterval;

                // Assign an event handler for the reading-changed event.
                inclinometer.ReadingChanged += Inclinometer_ReadingChanged;
            }
            else
            {
                statusBar.Message = "No inclinometer was found.";
                statusBar.Severity = InfoBarSeverity.Error;
                statusBar.IsOpen = true;
            }
        }

        // This event handler writes the current inclinometer
        // reading to the text blocks on the XAML page.
        private void Inclinometer_ReadingChanged(Inclinometer sender, InclinometerReadingChangedEventArgs args)
        {
            DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
            {
                InclinometerReading reading = args.Reading;
                txtPitch.Text = String.Format("{0,5:0.00}", reading.PitchDegrees);
                txtRoll.Text = String.Format("{0,5:0.00}", reading.RollDegrees);
                txtYaw.Text = String.Format("{0,5:0.00}", reading.YawDegrees);
            });
        }
    }
}
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Margin="24">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
        </Grid.RowDefinitions>
        <TextBlock Text="Pitch:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtPitch" Grid.Column="1" Text="---"/>

        <TextBlock Grid.Row="1" Text="Roll:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtRoll" Grid.Column="1" Grid.Row="1" Text="---"/>

        <TextBlock Grid.Row="2" Text="Yaw:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtYaw" Grid.Column="1" Grid.Row="2" Text="---"/>
    </Grid>

    <InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>

Wenn die App ausgeführt wird, können Sie die Neigungsmesserwerte ändern, indem Sie das Gerät verschieben.

Im vorherigen Beispiel wird der wesentliche Code veranschaulicht, den Sie schreiben müssen, um Neigungsmessereingaben in Ihre App zu integrieren.

Verbindung mit dem Sensor herstellen

Rufen Sie die GetDefault-Methode auf, um eine Verbindung mit dem Standardneigungsmesser herzustellen.

private Inclinometer? inclinometer;
// ...
inclinometer = Inclinometer.GetDefault();

Sie können auch FromIdAsync aufrufen, um ein Inclinometerobjekt aus einem DeviceInformation.Idwert zu erstellen. Weitere Informationen finden Sie unter "Aufzählen von Geräten".

Wenn kein Neigungsmessersensor erkannt wird, wird die Statusmeldung aktualisiert, um den Benutzer zu informieren.

Festlegen des Berichtsintervalls

Das Berichtsintervall wird im Konstruktor der Seite festgelegt. Dieser Code ruft das vom Gerät unterstützte Mindestintervall ab und vergleicht es mit einem angeforderten Intervall von 16 Millisekunden (was einer Aktualisierungsrate von 60 Hz entspricht). Wenn das unterstützte Mindestintervall größer als das angeforderte Intervall ist, legt der Code den Wert auf das Minimum fest. Andernfalls wird der Wert auf das angeforderte Intervall festgelegt.

uint minReportInterval = inclinometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
inclinometer.ReportInterval = reportInterval;

Lesen von Sensordaten

Die neuen Neigungsmesserdaten werden im ReadingChanged-Ereignishandler erfasst. Jedes Mal, wenn der Sensortreiber neue Daten vom Sensor empfängt, übergibt er die Werte mithilfe dieses Ereignisses an Ihre App. In diesem Beispiel werden diese neuen Werte in die Textblöcke geschrieben, die im XAML-Code für die entsprechende Seite enthalten sind.

inclinometer.ReadingChanged += Inclinometer_ReadingChanged;
// ...

private void Inclinometer_ReadingChanged(Inclinometer sender, InclinometerReadingChangedEventArgs args)
{
    DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        InclinometerReading reading = args.Reading;
        txtPitch.Text = String.Format("{0,5:0.00}", reading.PitchDegrees);
        txtRoll.Text = String.Format("{0,5:0.00}", reading.RollDegrees);
        txtYaw.Text = String.Format("{0,5:0.00}", reading.YawDegrees);
    });
}