Luz Caballero(@gerbille)曾任 Opera 的开发者关系负责人,并讨论了移动设备上设备方向的数学世界。
设备方向。它不仅仅是“纵向”和“横向”。它由三部分组成
- deviceorientation – 某人握持设备的角度是多少?
- devicemotion – 它是否在移动?它是否在加速?
- compassneedscallibration – 它朝哪个方向? (此特定事件在设备需要重新校准时触发)
有不同类型的应用程序可以利用此信息
静态应用程序 = 测量事物并对该信息进行一次性使用(例如地图应用程序)
动态应用程序 = 设备的持续移动,不断使用该信息来影响应用程序(例如赛车游戏)
Luz 展示了一个用 WebGL 绘制的茶壶的酷炫演示,并通过移动她的手机在 3D 中旋转它。连接是通过 Web Socket 从手机到网络建立的。
方向在数学上有点复杂(泰特-布莱恩角)。 有三个轴,然后是它们的各种组合。 Alpha、Beta 和 Gamma(它们也有其他名称,如“俯仰角”。)。

注意 alpha/gamma 奇点!(我认为这就像 交叉电流)。
“当设备指向上方时,加速度计不起作用” alpha gamma 奇点 @gerbille #W3Conf
— Nicole Sullivan (@stubbornella) 2013 年 2 月 22 日
其中一些可以使用 Remote.js 简化。我们之前看到的茶壶演示的代码看起来更容易实现。当收到 Web Socket 消息时,
avalue = data.alpha / 180 * Math.PI;
/* etc */
teapot.rotation.set(gvalue, avalue, -bvalue);
像往常一样,浏览器之间存在一些不一致性。Luz 为这些内容提供了一个测试套件 在 GitHub 上。 “原生”纵向或横向的设备之间也存在差异。 Firefox 和 Opera 对如何握持横向设备有不同的想法(线缆位于不同的侧面)。
解决这些差异的一种方法是要求用户在其当前设备上执行快速测试。然后记住它并在需要时将其用于数学运算。
在使用设备方向时,要求用户校准其设备似乎是唯一可靠的解决方案。 #w3conf
— Tim Hettler (@timhettler) 2013 年 2 月 22 日
这是一个 3D 指南针引擎,它处理缓冲(以实现更流畅的移动)。
对加速度(Safari)、accetrationIncludingGravity(Safari、Opera、Firefox)、rotationRate(Safari)和 interval 的支持也参差不齐。您可以使用if()
测试来相当轻松地测试支持情况。