获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度
Posted
技术标签:
【中文标题】获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度【英文标题】:Get angle between phone's z axis and the magnetic north pole (instead of y axis) 【发布时间】:2021-12-06 03:34:34 【问题描述】:我知道如何使用 getOrientation 方法获取手机 y 轴和磁北之间的方向角(如此处所述https://developer.android.com/guide/topics/sensors/sensors_position)。 但是,我需要手机的 z 轴和磁北之间的方向,以便获得手机摄像头的方向。我已经尝试编写自己的代码来从 y 轴和磁北之间的角度计算这个角度,但它给了我不可靠的数据,即使使用重力传感器数据进行了校正(例如当手机被翻转时)。
有没有办法直接得到z轴与磁北的夹角?
【问题讨论】:
【参考方案1】:以this question 为基础,我建议这样做:
private val rotationMatrix = FloatArray(9)
override fun onSensorChanged(event: SensorEvent)
if (event.sensor.type != Sensor.TYPE_ROTATION_VECTOR) return
SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values)
val azimuth = atan2(-rotationMatrix[2], -rotationMatrix[5])
... use azimuth ...
推理:
(rotationMatrix[2], rotationMatrix[5])
描述了手机的 z 向量在地球水平面上的投影,以(东、北)坐标表示。你需要与北轴的角度,所以北方向是你的x
,东方向是y
。 atan2
采用(y, x)
顺序中的参数,这就是为什么我将索引2 放在第一位,然后是5。z 向量指向手机的正面,但我假设你想要手机背面的方向,主摄像头在哪里。这就是我放减号的原因。
【讨论】:
太棒了,非常感谢。像梦一样工作!以上是关于获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度的主要内容,如果未能解决你的问题,请参考以下文章