传感器数据和显示方向 (HTML)
12/11/2015
本文内容
[ 本文适用于编写 Windows 应用于运行 Windows 8.x 和 Windows Phone 8.x 如果你想针对开发人员。 Windows 10 开发,请参考 最新文档 ]
来自 Accelerometer、Gyrometer、Compass、Inclinometer 和 OrientationSensor 类传感器数据由其参考轴定义。 这些轴由设备的横向方向定义,并在用户旋转设备时与之一起旋转。 如果您的应用程序支持自动旋转,即如果用户在旋转设备时重定向以适应设备,则在使用它之前必须调整旋转传感器数据。
显示方向和设备方向
为了了解传感器的参考轴,您需要区分显示方向和设备方向。显示方向是方向文本,图像显示在屏幕上,设备方向是设备的物理定位。在下图中,设备和显示方向都被使用 Landscape。
使用显示在下图中 LandscapeFlipped 显示和设备方向。
下一张图显示了使用 Landscape 显示方向和采用 LandscapeFlipped 设备方向。
你可以使用它 CurrentOrientation 属性的 GetForCurrentView 方法以通过 DisplayInformation 类查询方向值。然后,你可以通过和 DisplayOrientations 对比枚举创造逻辑。 请记住,参考轴的转换必须支持您支持的每个方向。
横向设备和纵向设备优先
制造商现在正在优先生产横向设备和纵向设备。当制造商将组件集成到设备中时,它们以统一一致的方式执行操作,使所有设备都能在相同的参考帧中运行。 下表显示了传感器轴,适用于纵向设备的传感器轴。
方向
优先横向
优先纵向
Landscape
Portrait
LandscapeFlipped
PortraitFlipped
显示方向和指南针方向
指南针的方向取决于参考轴,因此它随设备的方向而变化。 可以基于此表进行修正(假设用户面朝北)。
显示方向
用于指南针方位的参考轴
面朝北方时 API 指南针方位
指南针方向修正
Landscape
-Z
0
方位
Portrait
Y
90
(方位 270)% 360
LandscapeFlipped
Z
180
(方位 180)% 360
PortraitFlipped
Y
270
(方位 90)% 360
修改指南针方向(如表所示),以便正确显示方向,如下所示。
function readingChanged(e) {
var heading = e.reading.headingMagneticNorth;
var displayOffset;
// Calculate the compass heading offset based on
// the current display orientation.
var displayInfo = Windows.Graphics.Display.DisplayInformation.getForCurrentView();
switch (displayInfo.currentOrientation) {
case Windows.Graphics.Display.DisplayOrientations.landscape:
displayOffset = 0;
break;
case Windows.Graphics.Display.DisplayOrientations.portrait:
displayOffset = 270;
break;
case Windows.Graphics.Display.DisplayOrientations.landscapeFlipped:
displayOffset = 180;
break;
case Windows.Graphics.Display.DisplayOrientations.portraitFlipped:
displayOffset = 90;
break;
}
var displayCompensatedHeading = (heading displayOffset) % 360;
// Update the UI...
}
使用加速度计和陀螺测试仪显示方向
该表可示方向的加速度计和陀螺测试仪数据可转换此表。
参考轴
X
Y
Z
Landscape
X
Y
Z
Portrait
Y
-X
Z
LandscapeFlipped
-X
-Y
Z
PortraitFlipped
-Y
X
Z
这些转换可以应用到陀螺测试仪的代码示例。
function readingChanged(e) {
var reading = e.reading;
var displayOffset;
// Calculate the gyrometer axes based on
// the current display orientation.
var displayInfo = Windows.Graphics.Display.DisplayInformation.getForCurrentView();
switch (displayInfo.currentOrientation) {
case Windows.Graphics.Display.DisplayOrientations.landscape:
x_Axis = reading.angularVelocityX;
y_Axis = reading.angularVelocityY;
z_Axis = reading.angularVelocityZ;
break;
case Windows.Graphics.Display.DisplayOrientations.portrait:
x_Axis = reading.angularVelocityY;
y_Axis = -1 * reading.angularVelocityX;
z_Axis = reading.angularVelocityZ;
break;
case Windows.Graphics.Display.DisplayOrientations.landscapeFlipped:
x_Axis = -1 * reading.angularVelocityX;
y_Axis = -1 * reading.angularVelocityY;
z_Axis = reading.angularVelocityZ;
break;
case Windows.Graphics.Display.DisplayOrientations.portraitFlipped:
x_Axis = -1 * reading.angularVelocityY;
y_Axis = reading.angularVelocityX;
z_Axis = reading.angularVelocityZ;
break;
}
// Update the UI...
}
显示方向和设备方向
必须以不同的方式进行更改 OientationSensor。 请考虑逆时针旋转到 Z 轴时的不同方向,因此我们需要反向旋转以返回用户的方向。对于四元数数据,我们可以使用欧拉公式定义参考四元数的旋转,也可以使用参考旋转矩阵。
若要获取所需的相对方向,请用参考对象乘以绝对对象。请注意,此数学算法不可应用交换律。
在之前的表达式中,绝对对象由传感器数据返回。
显示方向
围绕 Z 进行逆时针旋转
参考四元数(反向旋转)
参考旋转矩阵(反向旋转)
Landscape
0
1 + 0i + 0j + 0k
[1 0 0
0 1 0
0 0 1]
Portrait
90
cos(-45⁰) + (i + j + k)*sin(-45⁰)
[0 1 0
-1 0 0
0 0 1]
LandscapeFlipped
180
0 - i - j - k
[1 0 0
0 1 0
0 0 1]
PortraitFlipped
270
cos(-135⁰) + (i + j + k)*sin(-135⁰)
[0 -1 0
1 0 0
0 0 1]