読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

加速度センサーを利用するには

加速度センサー

加速度センサーとは、主にデバイスの傾きを取得するセンサーです。

タブレットを傾けるだけでユーザーの入力を受け付けることができます。

 

加速度センサーを利用するにあたって、「どの軸を固定とした回転か」を考える必要があります。

以下の図のように

デバイスの上向きをY軸、

デバイスの横向きをX軸、

デバイスの奥向きをZ軸

として座標軸考えます。

 

6

 

加速度の値はちょうど軸の向きが重力と同じ向きになると1.0、重力と逆向きで-1.0の値をとります。

 

 

X軸固定回転

デバイスのX軸を固定とする回転は、AccelerationY値とAccelerationZ値が変化します。

3

 

 

Y軸固定回転

デバイスのY軸を固定とする回転は、AccelerationX値とAccelerationZ値が変化します。

 

4

 

Z軸固定回転

デバイスのZ軸を固定とする回転は、AccelerationX値とAccelerationY値が変化します。

 

5

 

 

Accelerometer

加速度を取得するにはAccelerometerクラスを使用します。

ReportInterval値に値を設定することで加速度を取得する時間間隔を設定することができます。

また、MinimumReportIntervalプロパティによって、デバイスが取得できる間隔の最小値を取得することができます。

ReadingChangedイベントによって加速度センサーから値を取得することができますが、このイベントは別スレッドで呼ばれるのでDispatcher.RunAsyncでUIスレッドで実行してやる必要があります。

 

まずはXAMLでUIをつくります。

<Grid>
    <StackPanel>
        <TextBlock x:Name="text_x" FontSize="24" />
        <TextBlock x:Name="text_y" FontSize="24" />
        <TextBlock x:Name="text_z" FontSize="24" />
    </StackPanel>
</Grid>

 

コンストラクタでAccelerometerクラスを初期化します。

Accelerometer meter = Accelerometer.GetDefault();

//最小値に50を乗算した値を加速度取得間隔とする
meter.ReportInterval = meter.MinimumReportInterval * 50 ;

meter.ReadingChanged += async (s, ee) =>
{
    //UIスレッドで実行
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, ()=>
    {
        
        text_x.Text = string.Format("X={0}",ee.Reading.AccelerationX.ToString("F1"));
        text_y.Text = string.Format("Y={0}", ee.Reading.AccelerationY.ToString("F1"));
        text_z.Text = string.Format("Z={0}", ee.Reading.AccelerationZ.ToString("F1"));
        
    });
   
};

 

また、加速度センサーを利用してシェイク動作を検知することもできます。

meter.Shaken += async(s, ee) =>
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async()=>
    {
        
        MessageDialog dialog = new MessageDialog("シェイクを検知しました");
        await dialog.ShowAsync();
    });
};

 

 

加速度センサーを利用するには | garicchi.com