1. 程式人生 > >使用 Windows 10 中的加速度計(Accelerometer,重力感測器)

使用 Windows 10 中的加速度計(Accelerometer,重力感測器)

在做 UWP 應用開發的時候還有什麼理由可以用到加速度計呢?場景很多啦,比如做遊戲,做類似 Surface Hub 那種一邊旋轉,一邊所有內容跟著一起轉的效果。

Windows 10 UWP 中的加速度計使用非常簡單,只需要簡單幾句程式碼即可。


本文內容

重力迷宮遊戲

這裡有一個利用加速度計的好玩的例子:

用 Lumia 950XL 玩重力迷宮
▲ 用 Lumia 950XL 玩重力迷宮

畫質太渣了?確實太渣了。那就看看桌面版吧…… 反正是 UWP,兩邊看起來是一樣的。

重力迷宮桌面版畫面(高清版)
▲ 重力迷宮桌面版畫面(高清版)

初始化 Accelerometer

AccelerometerWindows.Devices.Sensors 名稱空間下,使用時需要在類頂部加上 using

using Windows.Devices.Sensors;

而獲得加速度計的例項只需要一句話:

_accelerometer = Accelerometer.GetDefault();

如果裝置上沒有加速度計,那麼這裡拿到的例項就會是 null

。所以注意需要進行 null 判斷,畢竟大部分 Windows 10 裝置都是普通電腦,沒有加速度計的。

現在,我們對加速度計進行一些簡單的初始化:

_accelerometer = Accelerometer.GetDefault();
if (_accelerometer != null)
{
    // 設定加速度計讀數的報告間隔。這裡我們與 16ms 進行判斷,如果小於 16ms 就設為 16ms。
    // 因為我們在做遊戲,幀數就是 60Hz,也就是說,我們不需要更高的讀數間隔。
    uint minReportInterval = _accelerometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16; _accelerometer.ReportInterval = reportInterval; // 監聽 ReadingChanged 事件,以便在加速度計讀數改變時做一些操作。 _accelerometer.ReadingChanged += Accelerometer_ReadingChanged; }

得到 Accelerometer 的讀數

在監聽事件的 Accelerometer_ReadingChanged 事件中,我們可以得到加速度計的讀數。

private float _xAxis;
private float _yAxis;
private float _zAxis;

private void Accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs e)
{
    AccelerometerReading reading = e.Reading;
    _xAxis = (float) reading.AccelerationX;
    _yAxis = (float) reading.AccelerationY;
    _zAxis = (float) reading.AccelerationZ;
}

這些讀數是 -1 到 1 之間的數值。

將 Accelerometer 的讀數轉化成傾斜角度

Win2D 中的遊戲迴圈:CanvasAnimatedControl 一文中,我在 PC 上玩這款遊戲,也是在模擬桌子的傾角。於是我們也需要將讀數轉化成 Windows 10 裝置的傾斜角度。

private (float xAngle, float yAngle) GetTiltAngles()
{
    if (_accelerometer != null)
    {
        // 從加速度計中讀取讀數,然後轉換成裝置傾斜角度。
        return ((float) (-_yAxis * Math.PI / 2), (float) (-_xAxis * Math.PI / 2));
    }
    else
    {
        // 如果沒有加速度計,則從鍵盤獲得模擬的傾斜角度。
        return GetTiltAnglesByKeyboard();
    }
}

這裡的 _xAxis_yAxis 就是前面在 Accelerometer_ReadingChanged 事件中獲得的讀數數值。

這裡計算所得的角度值是下面圖片中所指示的角度值。

X 方向數值
▲ X 方向數值

Y 方向數值
▲ Y 方向數值


參考資料