- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 Android 重力和磁场传感器通过 SensorManager.getRotationMatrix 和 SensorManager.getOrientation 计算方向。这给了我方位角、俯仰角和方向数。当设备平放在 table 上时,结果看起来很合理。
但是,我在 list 中禁用了纵向和横向之间的切换,因此 getWindowManager().getDefaultDisplay().getRotation() 始终为零。当我将设备旋转 90 度使其垂直站立时,我遇到了麻烦。有时数字看起来很不对,我意识到这与 Gimbal lock 有关。 .但是,其他应用程序似乎没有这个问题。例如,我将我的应用程序与两个免费的传感器测试应用程序(Sensor Tester (Dicotomica) 和 Sensor Monitoring (R's Software))进行了比较。当设备是平的时,我的应用程序与这些应用程序一致,但当我将设备旋转到垂直位置时,可能会有显着差异。这两个应用似乎彼此一致,那么他们如何解决这个问题呢?
最佳答案
当设备不是平面的时候,你必须在调用getOrientation
之前调用remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);
。
getOrientation
返回的方位角
是通过将设备单元Y 轴
正交投影到世界东西-北平面
然后计算生成的投影向量与北轴之间的角度。
现在我们通常认为方向是后置摄像头指向的方向。这是 -Z
的方向,其中 Z
是指向屏幕外的设备轴。当设备是扁平的时,我们不会考虑方向并接受任何给定的东西。但是当它不平坦时,我们期望它是 -Z
的方向。但是 getOrientation
计算的是 Y 轴
的方向,因此我们需要在调用 getOrientation
之前交换 Y 轴和 Z 轴
>。这正是 remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR)
所做的,它保持 X 轴
完整并将 Z 映射到 Y
。
现在你怎么知道什么时候remap
或不。您可以通过检查
float inclination = (float) Math.acos(rotationMatrix[8]);
if (result.inclination < TWENTY_FIVE_DEGREE_IN_RADIAN
|| result.inclination > ONE_FIFTY_FIVE_DEGREE_IN_RADIAN)
{
// device is flat just call getOrientation
}
else
{
// call remap
}
上面的倾角是设备屏幕与世界东西北平面之间的角度。它显示了设备倾斜的程度。
关于android - 当我的 Android 设备不平时,我应该如何计算方位角、俯仰角和方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15649684/
我是一名优秀的程序员,十分优秀!