Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 测量直立装置的侧向倾斜_Android_Physics_Accelerometer_Android Sensors_Screen Rotation - Fatal编程技术网

Android 测量直立装置的侧向倾斜

Android 测量直立装置的侧向倾斜,android,physics,accelerometer,android-sensors,screen-rotation,Android,Physics,Accelerometer,Android Sensors,Screen Rotation,一些摄像头应用程序有一个功能,无论手机如何倾斜,它们都会在屏幕上显示一条与地平线平行的线。所谓“侧向倾斜”,我指的是绕垂直于屏幕的轴旋转设备 我已经尝试了大多数“正常”旋转函数,例如将旋转向量传感器与getRotationMatrix()和getOrientation()组合,但没有一个轴与我要找的轴对应 我还尝试只使用加速计,对所有三个轴进行标准化,并检测X轴中的重力。当设备完全直立(即不向前/向后倾斜)时,此功能正常工作。但一旦它向前或向后倾斜,测得的侧向倾斜就变得越来越不准确,因为重力现在

一些摄像头应用程序有一个功能,无论手机如何倾斜,它们都会在屏幕上显示一条与地平线平行的线。所谓“侧向倾斜”,我指的是绕垂直于屏幕的轴旋转设备

我已经尝试了大多数“正常”旋转函数,例如将
旋转向量
传感器与
getRotationMatrix()
getOrientation()
组合,但没有一个轴与我要找的轴对应

我还尝试只使用加速计,对所有三个轴进行标准化,并检测
X轴中的重力。当设备完全直立(即不向前/向后倾斜)时,此功能正常工作。但一旦它向前或向后倾斜,测得的侧向倾斜就变得越来越不准确,因为重力现在同时作用在两个轴上


关于如何实现这种侧向旋转检测,即使手机稍微向前/向后倾斜/倾斜,也能正常工作,您有什么想法吗?

getRotationMatrix
的结果将从手机的局部坐标系转换为世界坐标系。因此,其列是手机的主轴,第一列是手机的
X
-轴(在纵向模式下握住手机时为+ve水平轴),第二列是
Y

要在手机屏幕上获取地平线方向,必须找到水平面(世界空间)和手机平面之间的交线。首先在手机的本地基础上找到世界
Z
-轴(指向天空)的坐标,即
转置(R)*[0,0,1]
;由
R[2][0],R[2][1]
给出的
XY
坐标是屏幕空间中的垂直方向。然后,所需的水平线方向为
R[2][1],-R[2][0]


当手机接近水平时,该向量的大小变得非常小-地平线不再清晰。只需停止更新低于某个阈值的地平线即可。

谢谢,但我不确定如何实现您的
transpose(R)*[0,0,1
?因为这是StackOverflow而不是Math StackExchange,所以最好包含一些代码。@badcash您不需要。您只需要
R[2][1],-R[2][0]
。不管怎么说,我不知道实施起来有多困难,没有冒犯