在做 UWP 应用开发的时候还有什么理由可以用到加速度计呢?场景很多啦,比如做游戏,做类似 Surface Hub 那种一边旋转,一边所有内容跟着一起转的效果。

Windows 10 UWP 中的加速度计使用非常简单,只需要简单几句代码即可。


重力迷宫游戏

这里有一个利用加速度计的好玩的例子:


▲ 用 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 方向数值


▲ Y 方向数值


参考资料

使用 Windows 10 中的加速度计(Accelerometer,重力传感器)的更多相关文章

  1. 【翻译】Windows 10 中为不同设备加载不同页面的3种方法

    在以前,为PC和手机做App是两个工程,PC和手机各一个.在Windows 10中会发现只有一个了,对于简单的页面变化可以使用VisualState来解决,但是比如网易云音乐这种PC版和手机版差异巨大 ...

  2. 如何完全禁用或卸载Windows 10中的OneDrive - 51CTO.COM

    OneDrive 是微软的个人云存储平台,提供了对个人用户的文件托管.存储和同步等服务,OneDrive 默认被内置在 Windows 10 操作系统当中,而且当用户使用 微软账户 登录时,OneDr ...

  3. [转载]在 Windows 10 中, 如何卸载和重新安装 OneNote App

    在 Windows 10 中, 如何卸载和重新安装 OneNote App 15/8/2015 使用 PowerShell 命令卸载 OneNote App 开始菜单 -> 输入 "P ...

  4. 在Windows 10中截取截图的6种方式 简介

    在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要.它可以用于捕获笔记本电脑上的任何内容的截图.所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的.因 ...

  5. 重装助手教你如何在Windows 10中更改您的帐户名称

    当您设置新的Win10免费下载 PC时,您选择用户名的部分可能会让您措手不及.如果是这种情况,您可以选择弹出头部的第一件事或者您打算稍后更改的随机和临时事物.但令人惊讶的是,在Windows 10中更 ...

  6. 如何在 Windows 10 中搭建 Node.js 环境?

    [编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js 环境.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在本文中 ...

  7. Windows 10 中的存储空间

    存储空间有助于保护你的数据免受驱动器故障的影响,并随着你向电脑添加驱动器而扩展存储.你可以使用存储空间将两个或多个驱动器一起分组到一个存储池中,然后使用该池的容量来创建称为存储空间的虚拟驱动器.这些存 ...

  8. [转]如何在Windows 10中更改文件夹背景颜色

    ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...

  9. []如何在Windows 10中更改文件夹背景颜色

    ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...

随机推荐

  1. win10用键盘控制鼠标

    打开控制面板 进入轻松使用 更改鼠标的工作方式 勾选启用鼠标键 点击设置鼠标键 应用确定 ctrl+shift+numlock开启鼠标键 小键盘8426上下左右,5类似鼠标单击 ctrl+小键盘加速, ...

  2. (28)Cocos2d-x xml解析

    Cocos2d-x 已经加入了tinyxml2用于xml的解析.3.0版本位于external/tinyxml2下.2.x版本位于cocos2dx/support/tinyxml2下. tinyxml ...

  3. SQL sqlserver order by 1,order by 后面直接加数字,多个字段排序

    ①select * from table order by n 表示select里面的第n个字段 ②多个字段排序

  4. 【运维技术】CentOS7上从零开始安装LAMP安装织梦DedeCMS教程

    前期准备数据 centos7 系统 安装 appache httpd # 更新httpd yum update httpd # 安装httpd yum install -y httpd # 启动服务 ...

  5. 通过自动回复机器人学Mybatis:MySQL脚本 + db >> dao >> service >> servlet

    留着参考 makeData.sql delimiter // create procedure make_data() begin declare i int ; do insert into mes ...

  6. foo、bar美国版的张三李四

    不管看javascript还是其他语言举例,经常看到使用foo和bar来充当变量.那么究竟foo.bar是什么鬼? 一说:foo 和 bar 组合在一起所构成的 foobar 应该最能反映其原始的意思 ...

  7. phpstorm 代码片段使用方法

    原文链接: http://wwwquan.com/show-66-121-1.html 4.Live Templates代码片断 A)我们先介绍一个代码片段最基本的功能,我们要实现的目标是在html文 ...

  8. JS封装简单后代选择器

    大概思路是这样的:通过判断传过来的参数是什么类型,如果是对象,那这里就是this(因为封装是自己用的,肯定不会随便乱传一个对象过来),如果是一个函数(匿名函数),那就是Dom加载(这里先不讲),如果是 ...

  9. ubinize的用法

    1.ubinize支持哪些选项 Usage: ubinize [options] <ini-file> Generate UBI images. An UBI image may cont ...

  10. Bootstrap and Angular