Android设备物理旋转读数

时间:2016-02-03 16:47:50

标签: java c# android math android-sensors

我试图读出Android设备的物理方向与特定的开始旋转相比,但无论我使用什么传感器,我似乎无法从中获得正确的旋转。我像这样初始化传感器:

mySensorManager.GetDefaultSensor(SensorType.RotationVector);

我尝试将索引0,1和2上的SensorChanged事件的'Values'读作X,Y,Z.这确实给出了一些在我旋转设备时改变的数字,但我似乎无法弄清楚如何获得特定轴周围的旋转值

我正在使用纵向模式下的平板电脑开发。即使平板电脑通常处于横向模式,这仍然可以正常工作。这就是为什么我被引导相信这就是为什么它报告的读数不是简单的0,0,0,而更像是90,0,0。

这不是一个容易解释的问题(部分是因为我不确定我是否完全理解它),因此需要解决更难的问题。所以基本上我正在提出这个问题,希望那里的某个人遇到类似的情况,并且可以帮助我。

或许只是一个3D矢量数学天才,希望在随机问题上花几分钟。

注意:

如果设备报告的值确实报告了不同的值,取决于它是手机还是平板电脑设备,我真的很感激处理这个问题的解决方案,并输出一个在所有设备上相等的值。虽然任何意见当然都值得赞赏。

1 个答案:

答案 0 :(得分:0)

因此,经过大量的挖掘和Java代码的移植之后,我设法使用此博客文章中的代码使其工作:Using orientation sensors: Simple Compass sample

以下是我的SensorChanged方法的最终结果:

    private float[] mGravity;
    private float[] mGeomagnetic;
    public void OnSensorChanged(SensorEvent e)
    {
        if (e.Sensor.Type == SensorType.Accelerometer)
            this.mGravity = e.Values.ToArray();
        if (e.Sensor.Type == SensorType.MagneticField)
            this.mGeomagnetic = e.Values.ToArray();
        if (this.mGravity != null && this.mGeomagnetic != null)
        {
            float[] R = new float[9];
            float[] I = new float[9];
            bool success = SensorManager.GetRotationMatrix(R, I, this.mGravity, this.mGeomagnetic);
            if (success)
            {
                var orientation = new float[3];
                SensorManager.GetOrientation(R, orientation);

                var rotation = new Vector3(orientation[0], orientation[1], orientation[2]);
                this.ReadingReceived?.Invoke(this, rotation);
            }
        }
    }