获取 phone 的 z 轴与磁北极(而不是 y 轴)之间的角度

Get angle between phone's z axis and the magnetic north pole (instead of y axis)

我知道如何使用 getOrientation 方法(如此处 https://developer.android.com/guide/topics/sensors/sensors_position 所述)获取 phone 的 y 轴与磁北之间的方向角。 但是,我需要 phone 的 z 轴和磁北之间的方向,以便获得 phone 相机的方向。我已经尝试编写自己的代码来根据 y 轴和磁北之间的角度计算这个角度,但它给了我不可靠的数据,即使使用重力传感器数据进行了校正(例如,当 phone 被翻转时结束)。

有没有办法直接得到z轴和磁北的夹角?

基于 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]) 根据(东、北)坐标描述了 phone 的 z 向量在地球水平面上的投影。您需要与北轴的角度,所以北方向是您的 x,东方向是 yatan2(y, x) 顺序获取参数,这就是为什么我将索引 2 先放然后再放 5 的原因。z 向量指向 phone 的前面,但我猜你想要 phone 背面的方向,主摄像头所在的位置。这就是我放减号的原因。