某些相机应用程序具有以下功能:无论手机如何向侧面倾斜,它们都会在屏幕上显示一条始终与地平线平行的线条。 “侧向倾斜”是指围绕垂直于屏幕的轴旋转设备。
我尝试了大多数“正常”旋转功能,例如将ROTATION_VECTOR
传感器与getRotationMatrix()
和getOrientation()
组合在一起,但结果轴似乎都不对应于我我正在寻找。
我还尝试仅使用加速度计,对所有三个轴进行标准化并检测X-axis
中的重力程度。当设备完全直立时(即不向前/向后倾斜),这种方法可以正常工作。但是一旦它向前或向后倾斜,测得的侧向倾斜变得越来越不准确,因为重力现在同时作用在两个轴上。
关于如何实现这种侧向旋转检测的任何想法,即使手机稍微向前/向后倾斜/倾斜也能正常工作?
答案 0 :(得分:1)
getRotationMatrix
的结果从手机的本地坐标系转换为世界坐标系。因此,它的列是手机的主轴,第一个是手机的X
- 轴(手持纵向模式时+ ve水平轴),第二个是Y
。
要在手机屏幕上获取地平线的方向,必须找到水平面(世界空间)和手机平面之间的交线。首先在手机的本地基础上找到世界Z
- 轴(指向天空)的坐标 - 即transpose(R) * [0, 0, 1]
;由XY
给出的R[2][0], R[2][1]
坐标是屏幕空间中的垂直方向。然后,所需的水平线方向为 R[2][1], -R[2][0]
。
当手机接近水平时,此矢量的幅度变得非常小 - 地平线不再明确定义。只需停止更新某个阈值以下的水平线。