当前位置: 首页 > news >正文

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

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

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


本文内容

      • 重力迷宫游戏
      • 初始化 Accelerometer
      • 得到 Accelerometer 的读数
      • 将 Accelerometer 的读数转化成倾斜角度
        • 参考资料

重力迷宫游戏

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

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


参考资料

  • Use the accelerometer - UWP app developer - Microsoft Docs

相关文章:

  • 用 dotTrace 进行性能分析时,各种不同性能分析选项的含义和用途
  • 如何创建一个基于 .NET Core 3 的 WPF 项目
  • 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
  • 了解 .NET 的默认 TaskScheduler 和线程池(ThreadPool)设置,避免让 Task.Run 的性能急剧降低
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • 在有 UI 线程参与的同步锁(如 AutoResetEvent)内部使用 await 可能导致死锁
  • 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 LazyT 中导致死锁
  • 定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中什么样的类是可使用 await 异步等待的?
  • Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)
  • 使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范
  • StyleCop 是什么,可以帮助团队带来什么价值?
  • 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了
  • C#/.NET 使用 CommandLineParser 来标准化地解析命令行
  • [译]如何构建服务器端web组件,为何要构建?
  • 【译】理解JavaScript:new 关键字
  • Angular Elements 及其运作原理
  • AngularJS指令开发(1)——参数详解
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • JavaScript 奇技淫巧
  • Java读取Properties文件的六种方法
  • leetcode386. Lexicographical Numbers
  • Linux后台研发超实用命令总结
  • Logstash 参考指南(目录)
  • SQLServer之创建数据库快照
  • Vue--数据传输
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 复习Javascript专题(四):js中的深浅拷贝
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 计算机在识别图像时“看到”了什么?
  • 利用DataURL技术在网页上显示图片
  • 深入浏览器事件循环的本质
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 详解NodeJs流之一
  • 原生js练习题---第五课
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (C++17) std算法之执行策略 execution
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (阿里云万网)-域名注册购买实名流程
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)大型网站的系统架构
  • .NET CF命令行调试器MDbg入门(一)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @GetMapping和@RequestMapping的区别
  • [ C++ ] STL---string类的模拟实现
  • [22]. 括号生成
  • [④ADRV902x]: Digital Filter Configuration(发射端)