Gebruik de inclinometer

Leer hoe u de hellingsmeter gebruikt om pitch, roll en yaw te bepalen.

In dit voorbeeld wordt een eenvoudige app gemaakt die afhankelijk is van een hellingsmeter als invoerapparaat. Sommige 3D-games vereisen een hellingsmeter als invoerapparaat. Een veelvoorkomend voorbeeld is een vluchtsimulator, die de drie assen van de hellingsmeter (X, Y en Z) kan toewijzen aan de lift, aileron en roerinvoer van het vliegtuig.

Note

Dit artikel is gericht op code die laat zien hoe u een hellingsmeter gebruikt. Zie Sensoren: Inclinometer voor een overzicht van de inclinometersensor.

Prerequisites

U moet bekend zijn met de inclinometersensor en het gebruik ervan. Zie Sensoren: Inclinometer.

Het apparaat of de emulator die u gebruikt, moet een hellingsmeter ondersteunen.

Voorbeeldcode

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>

Wanneer de app wordt uitgevoerd, kunt u de inclinometerwaarden wijzigen door het apparaat te verplaatsen.

In het vorige voorbeeld ziet u de essentiƫle code die u moet schrijven om inclinometer-invoer in uw app te integreren.

Verbinding maken met de sensor

Roep de GetDefault-methode aan om een verbinding tot stand te brengen met de standaard inclinometer.

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

U kunt ook FromIdAsync aanroepen om een Inclinometer-object te maken op basis van een DeviceInformation.Id waarde. Zie Apparaten inventariseren voor meer informatie.

Als er geen inclinometersensor wordt gedetecteerd, wordt het statusbericht bijgewerkt om de gebruiker hiervan op de hoogte te stellen.

Het rapportinterval instellen

Het rapportinterval wordt ingesteld in de constructor van de pagina. Met deze code wordt het minimale interval opgehaald dat door het apparaat wordt ondersteund en vergeleken met een aangevraagd interval van 16 milliseconden (wat een vernieuwingsfrequentie van 60 Hz bij benadering is). Als het minimaal ondersteunde interval groter is dan het aangevraagde interval, stelt de code de waarde in op het minimum. Anders wordt de waarde ingesteld op het aangevraagde interval.

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

Sensorgegevens lezen

De nieuwe inclinometergegevens worden opgevangen in de eventhandler ReadingChanged. Telkens wanneer het sensorstuurprogramma nieuwe gegevens van de sensor ontvangt, worden de waarden aan uw app doorgegeven met behulp van deze gebeurtenis. In dit voorbeeld worden deze nieuwe waarden naar de tekstblokken geschreven die in de XAML voor de bijbehorende pagina zijn gevonden.

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