使用 Windows 10 中的加速度计(Accelerometer,重力传感器)
在做 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 方向数值
参考资料
使用 Windows 10 中的加速度计(Accelerometer,重力传感器)的更多相关文章
- 【翻译】Windows 10 中为不同设备加载不同页面的3种方法
在以前,为PC和手机做App是两个工程,PC和手机各一个.在Windows 10中会发现只有一个了,对于简单的页面变化可以使用VisualState来解决,但是比如网易云音乐这种PC版和手机版差异巨大 ...
- 如何完全禁用或卸载Windows 10中的OneDrive - 51CTO.COM
OneDrive 是微软的个人云存储平台,提供了对个人用户的文件托管.存储和同步等服务,OneDrive 默认被内置在 Windows 10 操作系统当中,而且当用户使用 微软账户 登录时,OneDr ...
- [转载]在 Windows 10 中, 如何卸载和重新安装 OneNote App
在 Windows 10 中, 如何卸载和重新安装 OneNote App 15/8/2015 使用 PowerShell 命令卸载 OneNote App 开始菜单 -> 输入 "P ...
- 在Windows 10中截取截图的6种方式 简介
在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要.它可以用于捕获笔记本电脑上的任何内容的截图.所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的.因 ...
- 重装助手教你如何在Windows 10中更改您的帐户名称
当您设置新的Win10免费下载 PC时,您选择用户名的部分可能会让您措手不及.如果是这种情况,您可以选择弹出头部的第一件事或者您打算稍后更改的随机和临时事物.但令人惊讶的是,在Windows 10中更 ...
- 如何在 Windows 10 中搭建 Node.js 环境?
[编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js 环境.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在本文中 ...
- Windows 10 中的存储空间
存储空间有助于保护你的数据免受驱动器故障的影响,并随着你向电脑添加驱动器而扩展存储.你可以使用存储空间将两个或多个驱动器一起分组到一个存储池中,然后使用该池的容量来创建称为存储空间的虚拟驱动器.这些存 ...
- [转]如何在Windows 10中更改文件夹背景颜色
ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...
- []如何在Windows 10中更改文件夹背景颜色
ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...
随机推荐
- 系统管理命令之whoami
whoami命令用于打印当前有效的用户名称,相当于执行id --un命令. 1.显示该命令帮助信息: # whoami --help 2.显示该命令的版本信息: # whoami --version ...
- FlexPaper_1.2.1.swc——Flex在线显示PDF文档(使用FlexPaper)感悟
http://www.cnblogs.com/wuhenke/archive/2010/03/16/1686885.html 想想自己先前搞PDF转SWF,然后在线浏览功能时,实在是费了不少精力.后来 ...
- cookie的存取删
存: document.cookie = "name=Kevin;expires="+new Date().getDate()+7; //有效期7天 取: function Get ...
- STM32之独立版USB(Host)驱动+MSC+Fatfs移植
源:STM32之独立版USB(Host)驱动+MSC+Fatfs移植 STM32之USB驱动库详解(架构+文件+函数+使用说明+示例程序)
- 强连通分量(Korasaju & Tarjan)学习笔记
好久以前学过的东西...现在已经全忘了 很多图论问题需要用到强连通分量,还是很有必要重新学一遍的 强连通分量(Strongly Connected Component / SCC) 指在一个有向图中, ...
- MyBatis的简单入门学习
一个新知识开始是最难学的.(万事开头难) MyBatis大体分三层,接口层,数据处理层,基础支撑层. 其中接口层不是java中的那个interface,而是框架和程序员之间的对接.一个API,程序员可 ...
- LA 3268 号码簿分组(最大流+二分)
https://vjudge.net/problem/UVALive-3268 题意: 有n个人和m个组.一个人可能属于很多组.现在请你从某些组中去掉几个人,使得每个人只属于一个组,并使得人数最多的组 ...
- Java中含有静态成员的的初始化顺序
class Bowl{ Bowl(int marker){ System.out.println("Bowl(" + marker + ")" ); } voi ...
- 2016"百度之星" - 初赛(Astar Round2A) A.All X 矩阵快速幂
All X Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Des ...
- python 行列式计算
N= #声明2x2的数组arr并将所有元素赋值为 None arr=[[None] * N for row in range(N)] print('|a1 b1|') print('|a2 b2|') ...