Usare l'inclinometro

Scopri come usare l'inclinometro per determinare passo, rotolo e yaw.

Questo esempio crea una semplice app che si basa su un inclinometro come dispositivo di input. Alcuni giochi 3D richiedono un inclinometro come dispositivo di input. Un esempio comune è un simulatore di volo, che potrebbe mappare i tre assi dell'inclinometro (X, Y e Z) all'ascensore, all'aileron e agli input del timone dell'aereo.

Note

Questo articolo è incentrato sul codice che illustra come usare un inclinometro. Per una panoramica del sensore inclinometro, vedere Sensori: Inclinometro.

Prerequisiti

Dovresti avere familiarità con il sensore inclinometro e i suoi usi. Vedi Sensori: Inclinometro.

Il dispositivo o l'emulatore in uso deve supportare un inclinometro.

Esempio di codice

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>

Quando l'app viene eseguita, è possibile modificare i valori dell'inclinometro spostando il dispositivo.

L'esempio precedente illustra il codice essenziale da scrivere per integrare l'input inclinometro nella tua app.

Connettersi al sensore

Chiamare il metodo GetDefault per stabilire una connessione con l'inclinometro predefinito.

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

È anche possibile chiamare FromIdAsync per creare un valore Inclinometer da un valore DeviceInformation.Id. Per altre info, vedi Enumerare i dispositivi.

Se non viene rilevato alcun sensore inclinometro, il messaggio di stato viene aggiornato per informare l'utente.

Impostare l'intervallo del report

L'intervallo del report viene impostato all'interno del costruttore della pagina. Questo codice recupera l'intervallo minimo supportato dal dispositivo e lo confronta con un intervallo richiesto di 16 millisecondi (che approssima una frequenza di aggiornamento a 60 Hz). Se l'intervallo minimo supportato è maggiore dell'intervallo richiesto, il codice imposta il valore sul valore minimo. In caso contrario, imposta il valore sull'intervallo richiesto.

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

Leggere i dati dei sensori

I nuovi dati dell'inclinometro vengono acquisiti nel gestore eventi ReadingChanged . Ogni volta che il driver del sensore riceve nuovi dati dal sensore, passa i valori all'app usando questo evento. Per questo esempio, questi nuovi valori vengono scritti nei blocchi di testo trovati nel codice XAML per la pagina corrispondente.

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);
    });
}