傾斜計の使用Use the inclinometer

重要な APIImportant APIs

サンプルSample

傾斜計を使ってピッチ、ロール、ヨーを検出する方法を説明します。Learn how to use the inclinometer to determine pitch, roll, and yaw.

一部の 3D ゲームでは、入力デバイスとして傾斜計が必要です。Some 3-D games require an inclinometer as an input device. よくある例としては、フライト シミュレーターがあります。傾斜計の 3 軸 (X、Y、Z) を、航空機のエレベーター、エルロン、ラダーの入力として割り当てます。One common example is the flight simulator, which maps the three axes of the inclinometer (X, Y, and Z) to the elevator, aileron, and rudder inputs of the aircraft.

前提条件Prerequisites

Extensible Application Markup Language (XAML)、Microsoft Visual C#、イベントについて理解している必要があります。You should be familiar with Extensible Application Markup Language (XAML), Microsoft Visual C#, and events.

使うデバイスやエミュレーターが傾斜計をサポートしている必要があります。The device or emulator that you're using must support a inclinometer.

シンプルな傾斜計アプリを作成するCreate a simple inclinometer app

このセクションは、次の 2 つのサブセクションに分かれています。This section is divided into two subsections. 最初のサブセクションでは、シンプルな傾斜計アプリケーションを最初から作成するために必要な手順を示します。The first subsection will take you through the steps necessary to create a simple inclinometer application from scratch. 次のサブセクションでは、作成したアプリについて説明します。The following subsection explains the app you have just created.

InstructionsInstructions

  • [Visual C#] プロジェクト テンプレートから [空白のアプリ (ユニバーサル Windows] を選んで、新しいプロジェクトを作成します。Create a new project, choosing a Blank App (Universal Windows) from the Visual C# project templates.

  • プロジェクトの MainPage.xaml.cs ファイルを開き、記載されているコードを次のコードで置き換えます。Open your project's MainPage.xaml.cs file and replace the existing code with the following.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;

    using Windows.UI.Core;
    using Windows.Devices.Sensors;


    namespace App1
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            private Inclinometer _inclinometer;

            // This event handler writes the current inclinometer reading to
            // the three text blocks on the app' s main page.

            private async void ReadingChanged(object sender, InclinometerReadingChangedEventArgs e)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    InclinometerReading reading = e.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);
                });
            }

            public MainPage()
            {
                this.InitializeComponent();
                _inclinometer = Inclinometer.GetDefault();


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

                    // Establish the event handler
                    _inclinometer.ReadingChanged += new TypedEventHandler<Inclinometer, InclinometerReadingChangedEventArgs>(ReadingChanged);
                }
            }
        }
    }

元のスニペットの名前空間の名前を、自分のプロジェクトに指定した名前に変更する必要があります。You'll need to rename the namespace in the previous snippet with the name you gave your project. たとえば、作成したプロジェクトの名前が InclinometerCS だとすると、namespace App1namespace InclinometerCS に置き換えます。For example, if you created a project named InclinometerCS, you'd replace namespace App1 with namespace InclinometerCS.

  • MainPage.xaml ファイルを開き、元の内容を次の XML に置き換えます。Open the file MainPage.xaml and replace the original contents with the following XML.
        <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">

        <Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
            <TextBlock HorizontalAlignment="Left" Height="21" Margin="0,8,0,0" TextWrapping="Wrap" Text="Pitch: " VerticalAlignment="Top" Width="45" Foreground="#FFF9F4F4"/>
            <TextBlock x:Name="txtPitch" HorizontalAlignment="Left" Height="21" Margin="59,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="71" Foreground="#FFFDF9F9"/>
            <TextBlock HorizontalAlignment="Left" Height="23" Margin="0,29,0,0" TextWrapping="Wrap" Text="Roll:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F1F1"/>
            <TextBlock x:Name="txtRoll" HorizontalAlignment="Left" Height="23" Margin="59,29,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="50" Foreground="#FFFCF9F9"/>
            <TextBlock HorizontalAlignment="Left" Height="19" Margin="0,56,0,0" TextWrapping="Wrap" Text="Yaw:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F3F3"/>
            <TextBlock x:Name="txtYaw" HorizontalAlignment="Left" Height="19" Margin="55,56,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="54" Foreground="#FFF6F2F2"/>

        </Grid>
    </Page>

元のスニペットのクラス名の最初の部分を、自分のアプリの名前空間に置き換える必要があります。You'll need to replace the first part of the class name in the previous snippet with the namespace of your app. たとえば、作成したプロジェクトの名前が InclinometerCS だとすると、x:Class="App1.MainPage"x:Class="InclinometerCS.MainPage" に置き換えます。For example, if you created a project named InclinometerCS, you'd replace x:Class="App1.MainPage" with x:Class="InclinometerCS.MainPage". また、xmlns:local="using:App1"xmlns:local="using:InclinometerCS" に置き換える必要があります。You should also replace xmlns:local="using:App1" with xmlns:local="using:InclinometerCS".

  • F5 キーを押すか 、[デバッグ] [デバッグの開始] を選択してアプリを > Start Debuggingビルド、デプロイ、実行します。Press F5 or select Debug > Start Debugging to build, deploy, and run the app.

アプリを実行した後、デバイスを移動するか、エミュレーター ツールを使うことによって、傾斜計の値を変更できます。Once the app is running, you can change the inclinometer values by moving the device or using the emulator tools.

  • Visual Studio に戻り、Shift キーを押しながら F5 キーを押すか、[デバッグ] [ > デバッグの停止] を選択してアプリを停止し、アプリを停止します。Stop the app by returning to Visual Studio and pressing Shift+F5 or select Debug > Stop Debugging to stop the app.

説明Explanation

上に示した例では、ごく短いコードを作成するだけで、傾斜計入力をアプリに組み込むことができることがわかります。The previous example demonstrates how little code you'll need to write in order to integrate inclinometer input in your app.

このアプリでは、MainPage メソッドで、既定の傾斜計との接続を確立しています。The app establishes a connection with the default inclinometer in the MainPage method.

_inclinometer = Inclinometer.GetDefault();

このアプリでは、MainPage メソッドで、レポート間隔を設定しています。The app establishes the report interval within the MainPage method. 次のコードは、デバイスでサポートされる最小の間隔を取得し、要求される 16 ミリ秒の間隔 (約 60 Hz のリフレッシュ レート) と比較します。This code retrieves the minimum interval supported by the device and compares it to a requested interval of 16 milliseconds (which approximates a 60-Hz refresh rate). サポートされる最小の間隔が要求される間隔よりも大きい場合は、値を最小値に設定します。If the minimum supported interval is greater than the requested interval, the code sets the value to the minimum. それ以外の場合は、値を要求される間隔に設定します。Otherwise, it sets the value to the requested interval.

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

ReadingChanged メソッドで、新しい傾斜計のデータをキャプチャしています。The new inclinometer data is captured in the ReadingChanged method. センサーのドライバーは、センサーから新しいデータを受け取るたびに、このイベント ハンドラーを使ってアプリに値を渡します。Each time the sensor driver receives new data from the sensor, it passes the values to your app using this event handler. このアプリの場合、このイベント ハンドラーが次の行で登録されています。The app registers this event handler on the following line.

_inclinometer.ReadingChanged += new TypedEventHandler<Inclinometer,
InclinometerReadingChangedEventArgs>(ReadingChanged);

プロジェクトの XAML 内にある TextBlock に、これらの新しい値が書き込まれます。These new values are written to the TextBlocks found in the project's XAML.

<TextBlock HorizontalAlignment="Left" Height="21" Margin="0,8,0,0" TextWrapping="Wrap" Text="Pitch: " VerticalAlignment="Top" Width="45" Foreground="#FFF9F4F4"/>
 <TextBlock x:Name="txtPitch" HorizontalAlignment="Left" Height="21" Margin="59,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="71" Foreground="#FFFDF9F9"/>
 <TextBlock HorizontalAlignment="Left" Height="23" Margin="0,29,0,0" TextWrapping="Wrap" Text="Roll:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F1F1"/>
 <TextBlock x:Name="txtRoll" HorizontalAlignment="Left" Height="23" Margin="59,29,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="50" Foreground="#FFFCF9F9"/>
 <TextBlock HorizontalAlignment="Left" Height="19" Margin="0,56,0,0" TextWrapping="Wrap" Text="Yaw:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F3F3"/>
 <TextBlock x:Name="txtYaw" HorizontalAlignment="Left" Height="19" Margin="55,56,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="54" Foreground="#FFF6F2F2"/>