傾斜計の使用

傾斜計を使用してピッチ、ロール、ヨーを決定する方法について説明します。

この例では、入力デバイスとして傾斜計に依存する単純なアプリを作成します。 一部の 3-D ゲームでは、入力デバイスとして傾斜計が必要です。 一般的な例として、傾斜計 (X、Y、Z) の 3 つの軸を航空機のエレベーター、エルロン、ラダー入力にマップできるフライト シミュレーターがあります。

Note

この記事では、傾斜計の使用方法を示すコードに焦点を当てます。 傾斜計センサーの概要については、「 センサー: 傾斜計」を参照してください。

前提条件

傾斜計センサーとその用途について理解している必要があります。 「センサー: 傾斜計」を参照してください。

使用しているデバイスまたはエミュレーターは、傾斜計をサポートしている必要があります。

サンプル コード

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>

アプリの実行時に、デバイスを移動することで傾斜計の値を変更できます。

前の例は、傾斜計入力をアプリに統合するために記述する必要がある重要なコードを示しています。

センサーに接続する

GetDefault メソッドを呼び出して、既定の傾斜計との接続を確立します。

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

また、FromIdAsync を呼び出して、DeviceInformation.Id 値から Inclinometer オブジェクトを作成することもできます。 詳細については、「デバイスの 列挙」を参照してください。

傾斜計センサーが検出されない場合は、ステータス メッセージが更新され、ユーザーに通知されます。

レポート間隔を設定する

レポート間隔は、ページのコンストラクター内で設定されます。 このコードは、デバイスでサポートされている最小間隔を取得し、16 ミリ秒 (約 60 Hz のリフレッシュ レート) の要求された間隔と比較します。 サポートされる最小間隔が要求された間隔より大きい場合、コードは値を最小値に設定します。 それ以外の場合は、要求された間隔に値が設定されます。

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

センサー データの読み取り

新しい傾斜計データは、 ReadingChanged イベント ハンドラーでキャプチャされます。 センサー ドライバーは、センサーから新しいデータを受信するたびに、このイベントを使用して値をアプリに渡します。 この例では、これらの新しい値は、対応するページの XAML で見つかったテキスト ブロックに書き込まれます。

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