ジャイロメーターを使用してユーザーの動きの変化を検出する方法について説明します。
ジャイロメーターは、加速度計をゲーム コントローラーとして補完します。 加速度計は直線運動を測定し、ジャイロメーターは角速度または回転運動を測定できます。
- 重要な API:Windows.Devices.Sensors, Gyrometer
Note
この記事では、ジャイロメーターの使用方法を示すコードに焦点を当てます。 ジャイロメーター センサーの概要については、「 センサー: ジャイロメーター」を参照してください。
前提条件
ジャイロメーター センサーとその使用方法について理解している必要があります。 「センサー: ジャイロメーター」を参照してください。
使用しているデバイスは、ジャイロメーターをサポートしている必要があります。
サンプル コード
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;
namespace DevicesDemo.Pages
{
public sealed partial class GyrometerPage : Page
{
private Gyrometer? gyrometer;
public GyrometerPage()
{
InitializeComponent();
// Get the default gyrometer sensor object.
gyrometer = Gyrometer.GetDefault();
if (gyrometer != null)
{
// Establish the report interval.
uint minReportInterval = gyrometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
gyrometer.ReportInterval = reportInterval;
// Assign an event handler for the reading-changed event.
gyrometer.ReadingChanged += Gyrometer_ReadingChanged;
}
else
{
statusBar.Message = "No gyrometer was found.";
statusBar.Severity = InfoBarSeverity.Error;
statusBar.IsOpen = true;
}
}
// This event handler writes the current gyrometer reading to
// the three axis text blocks on the XAML page.
private void Gyrometer_ReadingChanged(Gyrometer sender, GyrometerReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
GyrometerReading reading = args.Reading;
txtXAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);
txtYAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);
txtZAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);
});
}
}
}
<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="X-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtXAxis" Grid.Column="1" Text="---"/>
<TextBlock Grid.Row="1" Text="Y-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtYAxis" Grid.Column="1" Grid.Row="1" Text="---"/>
<TextBlock Grid.Row="2" Text="Z-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtZAxis" Grid.Column="1" Grid.Row="2" Text="---"/>
</Grid>
<InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>
アプリの実行時に、デバイスを移動することでジャイロメーターの値を変更できます。
前の例は、ジャイロメーター入力をアプリに統合するために記述する必要がある重要なコードを示しています。
センサーに接続する
GetDefault メソッドを呼び出して、既定のジャイロメーターとの接続を確立します。
private Gyrometer? gyrometer;
// ...
gyrometer = Gyrometer.GetDefault();
ジャイロメーター センサーが検出されない場合は、ステータス メッセージが更新され、ユーザーに通知されます。
レポート間隔を設定する
アプリは MainPage メソッド内でレポート間隔を確立します。 このコードは、デバイスでサポートされている最小間隔を取得し、16 ミリ秒 (約 60 Hz のリフレッシュ レート) の要求された間隔と比較します。 サポートされる最小間隔が要求された間隔より大きい場合、コードは値を最小値に設定します。 それ以外の場合は、要求された間隔に値が設定されます。
uint minReportInterval = gyrometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
gyrometer.ReportInterval = reportInterval;
センサー データの読み取り
新しいジャイロメーター データは、 ReadingChanged イベント ハンドラーでキャプチャされます。 センサー ドライバーは、センサーから新しいデータを受信するたびに、このイベントを使用して値をアプリに渡します。 この例では、これらの新しい値は、対応するページの XAML で見つかったテキスト ブロックに書き込まれます。
gyrometer.ReadingChanged += Gyrometer_ReadingChanged;
// ...
private void Gyrometer_ReadingChanged(Gyrometer sender, GyrometerReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
GyrometerReading reading = args.Reading;
txtXAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);
txtYAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);
txtZAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);
});
}
関連トピック
Windows developer