使用 Windows 10 中的加速度計(Accelerometer,重力感測器)
阿新 • • 發佈:2018-12-06
在做 UWP 應用開發的時候還有什麼理由可以用到加速度計呢?場景很多啦,比如做遊戲,做類似 Surface Hub 那種一邊旋轉,一邊所有內容跟著一起轉的效果。
Windows 10 UWP 中的加速度計使用非常簡單,只需要簡單幾句程式碼即可。
本文內容
重力迷宮遊戲
這裡有一個利用加速度計的好玩的例子:
▲ 用 Lumia 950XL 玩重力迷宮
畫質太渣了?確實太渣了。那就看看桌面版吧…… 反正是 UWP,兩邊看起來是一樣的。
▲ 重力迷宮桌面版畫面(高清版)
初始化 Accelerometer
Accelerometer
在 Windows.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 方向數值
▲ Y 方向數值