CodeZine(コードジン)

特集ページ一覧

センサーに対応したWindowsストアアプリを作成する(後編)

速習 Windowsストアアプリケーション 第13回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/08/18 14:00
目次

方位センサー

 方位センサー(OrientationSensor)は端末が向いている方向を取得します。取得する値は回転行列と四元数という形で取得可能で、主に3D表現などのベクトル演算に利用します。

 その他に、OrientationSensorより簡単な値を返すSimpleOrientationSensorがあります。

OrientationSensorの値を取得する

 (サンプルファイル:「OrientationSensorSample.zip」)

 方位センサーの値は以下のように取得します。

OrientationSensorの値を取得する
this._sensor = OrientationSensor.GetDefault();

if (this._sensor != null)
{
    this._sensor.ReadingChanged += _sensor_ReadingChanged;
}
else
{
    System.Diagnostics.Debug.WriteLine("OrientationSensor is null");
}

 ReadingChangedで取得した値は以下のように取り出します。

ReadingChangedでOrientationSensorの変更を取得する
async void _sensor_ReadingChanged(OrientationSensor sender, OrientationSensorReadingChangedEventArgs args)
{
    OrientationSensorReading reading = args.Reading;

    // 四元数を取得する
    SensorQuaternion quaternion = reading.Quaternion;

    // 回転行列を取得する
    SensorRotationMatrix rotationMatrix = reading.RotationMatrix;

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        quaternionX.Text = String.Format("{0,8:0.00000}", quaternion.X);
        quaternionY.Text = String.Format("{0,8:0.00000}", quaternion.Y);
        quaternionZ.Text = String.Format("{0,8:0.00000}", quaternion.Z);
        quaternionW.Text = String.Format("{0,8:0.00000}", quaternion.W);

        matrix_11.Text = String.Format("{0,8:0.00000}", rotationMatrix.M11);
        matrix_12.Text = String.Format("{0,8:0.00000}", rotationMatrix.M12);
        matrix_13.Text = String.Format("{0,8:0.00000}", rotationMatrix.M13);
        matrix_21.Text = String.Format("{0,8:0.00000}", rotationMatrix.M21);
        matrix_22.Text = String.Format("{0,8:0.00000}", rotationMatrix.M22);
        matrix_23.Text = String.Format("{0,8:0.00000}", rotationMatrix.M23);
        matrix_31.Text = String.Format("{0,8:0.00000}", rotationMatrix.M31);
        matrix_32.Text = String.Format("{0,8:0.00000}", rotationMatrix.M32);
        matrix_33.Text = String.Format("{0,8:0.00000}", rotationMatrix.M33);
    });
}

 サンプルコードのquaternionには四元数が、rotationMatrixには3×3の回転行列が格納されます。

SimpleOrientationSensorの値を取得する

 SimpleOrientationSensorはデバイスの方向を簡単に表現したクラスです。以下のように値の変更を取得します。

SimpleOrientationSensorの値を取得する
this._simpleSensor = SimpleOrientationSensor.GetDefault();
if (this._simpleSensor != null)
{
    this._simpleSensor.OrientationChanged += _simpleSensor_OrientationChanged;
}
else
{
    System.Diagnostics.Debug.WriteLine("SimpleOrientationSensor is null");
}

 ReadingChangedで取得した値は以下のように取り出します。

ReadingChangedでOrientationSensorの変更を取得する
SimpleOrientation orientation = args.Orientation;
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    switch (orientation)
    {
        case SimpleOrientation.Facedown:
            this.orientation.Text = "デバイスは下向きです";
            break;
        case SimpleOrientation.Faceup:
            this.orientation.Text = "デバイスは上向きです";
            break;
        case SimpleOrientation.NotRotated:
            this.orientation.Text = "デバイスは回転していません";
            break;
        case SimpleOrientation.Rotated180DegreesCounterclockwise:
            this.orientation.Text = "180度反時計回りに回転しています";
            break;
        case SimpleOrientation.Rotated270DegreesCounterclockwise:
            this.orientation.Text = "270度反時計回りに回転しています";
            break;
        case SimpleOrientation.Rotated90DegreesCounterclockwise:
            this.orientation.Text = "90度反時計回りに回転しています";
            break;
    }
});

 端末の向きはSimpleOrientation列挙型で取得でき、それぞれの値は以下の意味を持ちます。

Facedown

 端末は下向きで画面が伏せられています。

Faceup

 端末は上向きで画面が表示されています。

NotRotated

 端末は回転していません。

Rotated180DegreesCounterclockwise

 反時計回りに180度回転しています。

Rotated270DegreesCounterclockwise

 反時計回りに270度回転しています。

Rotated90DegreesCounterclockwise

 反時計回りに90度回転しています。

方位センサーサンプルの実行結果
方位センサーサンプルの実行結果

光センサー

 光センサーは端末のセンサー部が受け取る光の量を測定します。

光センサーの値を取得する

 (サンプルファイル:「LightSensorSample.zip」)

 光センサーの値の取得方法もこれまでと同様です。

光センサーの値を取得する
this._sensor = LightSensor.GetDefault();
if (this._sensor != null)
{
    this._sensor.ReadingChanged += _sensor_ReadingChanged;
}
else
{
    System.Diagnostics.Debug.WriteLine("Light Sensor is Null");
}

 ReadingChangedで取得した値は以下のように取り出します。

ReadingChangedでOrientationSensorの変更を取得する
LightSensorReading reading = args.Reading;
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    this.LUX.Text = reading.IlluminanceInLux.ToString();
});

 reading.IlluminanceInLuxの値は光量を表すルクスです。

光センサーサンプルの実行結果
光センサーサンプルの実行結果

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:速習 Windowsストアアプリケーション

もっと読む

著者プロフィール

  • 西村 誠(ニシムラ マコト)

     Microsoft MVP Windows Platform Development。  Flash、PHPの開発経験もあり国産ECサイト構築フレームワーク「EC-CUBE」の公式エバンジェリストでもある。  ブログ:眠るシーラカンスと水底のプログラマー  著書:基礎から学ぶ Windows...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5